Ошибка типа: 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] = ...
устранить один из .prototype
s.
Так как:
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
Прототип используется только тогда, когда вы объявляете функцию, но не когда вы ее вызываете. Прототип делает функцию членом объекта, который создается с каждым экземпляром этого объекта.