Ошибка типа: this.prototype не определен при вызове Function.prototype.method()

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

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

ОБНОВИТЬ:
Почему следующий код не работает?

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 ответа

Решение

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

Либо использовать Function.method(...) или же this[name] = ... устранить один из .prototypes.

Так как:

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

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

Другие вопросы по тегам