Почему методы экземпляра не работают должным образом? - PullRequest
2 голосов
/ 07 октября 2011
(function() {
     window.gArr = new ExtArray();
})();

function ExtArray() {
     this.bounce = function() {
         document.write("Bounced successfully!");
     };
}

ExtArray.prototype = new Array;
ExtArray.prototype.first = function() {
     document.write(this[0]);
}

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

Почему это не работает?

Ответы [ 2 ]

1 голос
/ 07 октября 2011

Вы должны определить window.gArr после того, как определите ExtArray.prototype:

function ExtArray() {
     this.bounce = function() {
         document.write("Bounced successfully!");
     };
}

ExtArray.prototype = new Array;
ExtArray.prototype.first = function() {
     document.write(this[0]);
}; // <-- semicolon will be REQUIRED here.

(function() {
    window.gArr = new ExtArray();
})();

DEMO: http://jsfiddle.net/Vg3Ze/

1 голос
/ 07 октября 2011
> (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 ). Таким образом, изменение прототипа подрядчика не меняет внутренний прототип каких-либо уже созданных экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...