Ошибка типа: this.prototype не определен при вызове Function.prototype.method () - PullRequest
5 голосов
/ 08 февраля 2012

Я читаю книгу "Javascript: хорошие части".
Сейчас я читаю главу об увеличении типов:

Function.prototype.method = function (name, func) {
   this.prototype[name] = func;
   return this;
};

UPDATE:
Почему следующий код не работает?

js> Function.prototype.method("test", function(){print("TEST")});
typein:2: TypeError: this.prototype is undefined

Но следующий код работает без проблем:

js> Function.method("test", function(){print("TEST")});
function Function() {[native code]}

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

js> var obj = {"status" : "ST"};
js> typeof obj;
"object"
js> obj.method = function(){print(this.status)};
(function () {print(this.status);})
js> obj.method();
ST

"объект" - это объект.
Но я могу вызвать метод «метод» на нем.
В чем разница между Function.prototype.method и obj.method?

Ответы [ 3 ]

5 голосов
/ 08 февраля 2012

this относится к Function.prototype, потому что вы назвали .method по этому вопросу.Итак, вы используете Function.prototype.prototype, который не существует.

Либо используйте Function.method(...), либо this[name] = ..., чтобы исключить один из .prototype s.

5 голосов
/ 08 февраля 2012

Потому что:

Function instanceof Function           // <--- is true
Function.prototype instanceof Function // <-- is false
  • Function.prototype является объектом и ничего не наследует от конструктора функции.
  • Function является конструктором, но такжефункция, поэтому она наследует методы от Function.prototype.
  • При вызове Function.method вы вызываете метод method экземпляра Function.Так, this указывает на созданный экземпляр Function.
  • При вызове Function.prototype.method вы вызываете обычный метод объекта.this указывает на Function.prototype.

Для пояснения, вот пример:

Function.method()                // is equivalent to
(function Function(){}).method()
(new Function).method()          // Because Function is also a function

Function.prototype.method // No instance, just a plain function call
0 голосов
/ 08 февраля 2012
Прототип

используется только тогда, когда вы объявляете функцию, но не когда вы ее вызываете. Прототип делает функцию членом объекта, который создается с каждым экземпляром этого объекта.

...