2012-03-16 5 views
3

私が理解しているように、関数のプロトタイププロパティは、その関数からインスタンス化されたすべてのオブジェクトにメソッド/プロパティを追加する方法です。Function.prototype.xを宣言した後にFunction.xが動作するのはなぜですか?

だから私はこの

function Person(){} 
Person.prototype.saySomething = function(){ alert("hi there"); } 

Person.saySomething(); 

ような何かをしようとすると、私はエラーを取得するイムはPersonオブジェクトのインスタンス上で機能を実行していないとして理にかなっている、「Person.saySomethingは関数ではありません」。

しかし、以下のコードを実行するのはなぜですか?

Function.prototype.sayHi = function(){ alert("hi!");} 

Function.sayHi(); 
+0

おそらくこれを例として使用していますが、ネイティブオブジェクトのプロトタイプ作成は悪い考えです。 – jbabey

+0

私は理解しています。私はいくつかのフレームワークでそれを見て、どのように動作しているのだろうと思っていた。 – levi

+1

@jbabey:いつそれが悪い考えですか?常に?私は反対する必要があります。 –

答えて

5

最初Personのインスタンスを作成する必要があります。コンストラクタのインスタンスが作成されたときに

new Person().saySomeThing(); 

プロトタイプのメソッド/プロパティはnewキーワードを経て、のみを継承しています。

Function.sayHi()があり、Functionコンストラクタがでもであるため、機能します。

+0

私はなぜ '関数'の例が働いたのか考えられませんでした。良い呼び出し、非常に賢い。あなたが本当に混乱したい場合は、 'Person'コンストラクタを' Function'の例で置くと、 'Person.sayHi()'もうまくいくでしょう... – jondavidjohn

+0

"関数コンストラクタは関数でもありますか"を詳しく説明できますか?私はそれを最初にインスタンス化することについての最初の点を理解しますが、なぜ2番目のものには「新しい」ものはありませんか? – levi

+0

@leviここでは簡単な言葉で説明しようとします: 'Function'は' function(){[native code]} 'と見なすことができます。すべての関数インスタンス( 'function(){}')は 'Function.prototype'を継承しているので、' Function'コンストラクタも影響を受けます。 'Function'が本当に' Function'のインスタンスであることを確認するには、** 'Function instanceof Function' **が' true'です。 –