> (function() {
> window.gArr = new ExtArray(); })();
Почему это предпочитается просто:
var gArr = new ExtArray();
они функционально идентичны (если нет оконного объекта, в этом случае первый потерпит неудачу);
> function ExtArray() {
> this.bounce = function() {
> document.write("Bounced successfully!");
> }; }
Использование document.write после завершения загрузки страницы сначала очистит документ весь (т. Е. Все, что находится между тегами HTML) и запишет все, что передано функции (в этом регистр, строка из двух слов).
> ExtArray.prototype = new Array;
> ExtArray.prototype.first = function() {
> document.write(this[0]);
> }
Как и выше, document.write является разрушительным.
> var eArr = new ExtArray();
> //all three work
> eArr.bounce();
> eArr.push("I am first! ");
> eArr.first();
Предположительно, это выполняется до события загрузки.
> // invoking global
> gArr.bounce(); // it works
> gArr.push("No, it is me who is really first! "); // doesn't work
> gArr.first(); // doesn't work
Биты, которые "не работают", потому что вы инициализировали gArr до того, как изменили ExtArray.prototype , поэтому у него есть метод экземпляра bounce , но все еще имеет прототип по умолчанию, когда конструктор был объявлен.
Помните, что как только объявления сделаны, код выполняется в последовательности, поэтому gArr = new ExtArray () запускается до ExtArray.prototype = new Array; и так далее.
Кроме того, экземпляр имеет внутреннее свойство prototype , которое ссылается на прототип конструктора в момент его создания, и не может быть изменено впоследствии (за исключением устаревшего в Mozilla свойство proto ). Таким образом, изменение прототипа подрядчика не меняет внутренний прототип каких-либо уже созданных экземпляров.