2012-02-08 11 views
5

"Javascript:The good parts"という本を読んでいます。次のコードは動作しないのはなぜ
TypeError:Function.prototype.method()を呼び出すとthis.prototypeが未定義です

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 

"obj"はオブジェクトです。
しかし、私はメソッド "メソッド"を呼び出すことができます。
Function.prototype.methodとobj.methodの違いは何ですか?

答えて

5

thisは、.methodを呼び出したので、Function.prototypeとなります。したがって、存在しないFunction.prototype.prototypeを使用しています。

Function.method(...)またはthis[name] = ...のいずれかを使用して.prototypeのいずれかを削除します。

+0

ありがとうございます。今分かります。私はこの行に次の行に注意を払わなかった.prototype [name] = func; –

5

ため:

Function instanceof Function   // <--- is true 
Function.prototype instanceof Function // <-- is false 
  • Function.prototypeがオブジェクトであり、関数のコンストラクタから何を継承しません。
  • Functionはコンストラクタですが、関数なので、Function.prototypeからメソッドを継承します。

  • Function.methodを呼び出す場合は、Functionというインスタンスのmethodメソッドを呼び出します。したがって、thisは、作成されたインスタンスFunctionを指しています。
  • Function.prototype.methodを呼び出すと、オブジェクトの通常のメソッドが呼び出されます。 thisFunction.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

私の質問の更新をご覧ください。 –

+0

"' Function.prototype.method'を呼び出すと、普通の関数が呼び出されます。 'this'は未定義(strictモード)または' window'を指します。 - これは正しくありません。それはあなたが呼び出しているオブジェクトを指しています。この場合は 'Function.prototype'となります。 – pimvdb

+0

@pimvdbだから私の質問からオブジェクトFunction.prototypeとオブジェクトobjの違いは何ですか? –

0

プロトタイプは、関数を宣言している場合にのみ使用されますが、あなたはそれを呼び出しているではないとき。 Prototypeは、そのオブジェクトのすべてのインスタンスで作成されるオブジェクトのメンバになります。

関連する問題