TypeError:调用Function.prototype.method()时未定义this.prototype

时间:2012-02-08 18:34:41

标签: javascript function prototype

我正在读“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有什么区别?

3 个答案:

答案 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使该函数成为使用该对象的每个实例创建的对象的成员。