我正在读“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
“obj”是对象 但我可以在其上调用方法“方法” Function.prototype.method和obj.method有什么区别?
答案 0 :(得分:5)
由于:
Function instanceof Function // <--- is true
Function.prototype instanceof Function // <-- is false
Function.prototype
是一个Object,不会从Function构造函数继承任何内容。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
答案 1 :(得分:5)
this
是指Function.prototype
,因为您就此致电.method
。所以,你正在使用不存在的Function.prototype.prototype
。
使用Function.method(...)
或this[name] = ...
消除其中一个.prototype
。
答案 2 :(得分:0)
原型仅在您声明函数时使用,但在您调用它时不会使用。 Prototype使该函数成为使用该对象的每个实例创建的对象的成员。