2012-03-07 5 views
2

javascriptのプロトタイプが不思議です。私は、プロトタイピングによって、ユーザーがコンストラクタまたはオブジェクトに新しいプロパティとメソッドを追加できることを知っています。私は、次の数回使用しているjavascript.prototype.abcとjavascript.prototypeの相違点

function Example() {} 
Example.prototype.add = function() {}; 
Example.prototype.sub = someVar; 

私は、オブジェクトの要素として機能し、Example.subとしてExample.addを使用することができますこの方法です。 誰かがこのようなことを書いたときに起こる

Example.prototype = function() { 
        //Code 
        }; 

助けが必要な場合はどうなりますか?

答えて

1

簡単な例を見てみましょうのような属性を与えることができます:

人のプロトタイプのためのいくつかのメソッドを定義する場合
var Person = function(args){ 
    this.init(args); 
} 

我々はこれを行うだろう:

Person.prototype = { 
    getAge : function(){}, 
    nickname : "R2D2" 
}; 

または

Person.prototype.getAge = function() {...}; 
Person.prototype.nickName= "R2D2"; 

どちらも同じことをします。私は最初のバージョンが好きです。読みやすく、書き込む文字数が少なくて済むからです(コードのフットプリントを小さくする)。私は

Person.prototype = function(){} 

を使用するための考えることができ

唯一の理由は、唯一の人のプロトタイプに利用できるプライベートスコープを作成することです。しかし、これにはオブジェクトを返す自己実行関数が必要です。

Person.prototype = (function(){ 
    var theAnswerToEverything = 42; 
    return { 
     getTheAnswerToEverything : function(){ 
      return theAnswerToEverything; 
     } 
    }; 
})(); 

theAnswerToEverythingは、Personsプロトタイプのメソッドによってのみ使用可能な変数になります。より複雑な例は、同じ原則を使用して作成することができます。

+0

自己実行関数を使ってローカルスコープを作成するというあなたの提案を理解していますが、あなたの例ではプロトタイプは関数ではありません。 –

+0

私は知っています。これは、単語のプロトタイプの近くでfunctionという単語を使用して考えることができる最も近いものです。 :)あなたが言ったように、プロトタイプはオブジェクトです...オブジェクトのプロトタイプをオブジェクトプロトタイプを持つ関数に設定するとどうなりますか? –

0

また、JavaScript関数もオブジェクトです。

したがって、プロトタイプはExampleオブジェクトのメンバーになります。ない機能 - あなたは

Example.prototype = function() { alert('hi'); }; 

を持っていた場合

そのオブジェクトを参照する必要があります

+0

javascriptですべてが動く:)、あなたは 'var undefined = true; ')、そして魔法を感じてください。(保障措置はあります) – labroo

1

"こんにちは" Example.prototypeを警告する

Example.prototype() 

を呼び出します。あなたの最初の例:

Example.prototype.add = function() {}; 
Example.prototype.sub = someVar; 

プロパティをプロトタイプに正しく追加しました(オブジェクトを覚えています)。したがって、追加した2つのプロパティは、new Example()によって作成されたオブジェクトに自動的に表示されます。あなたはとても起こる別のオブジェクト、つまりオブジェクトとプロトタイプを交換した

Example.prototype = function() {}; 

は、機能(Javascriptの機能は、まだオブジェクトであることを覚えている)です。 new Example()式で作成されたオブジェクトによって継承されるのは、この関数のプロパティです。

3

プロトタイプは、javascriptがメソッド/変数を探す場所です。

newを使用すると、コンストラクタのプロトタイプも作成されたオブジェクトに与えられます。

したがって、プロトタイプはOBJECTである必要があります(内容も変更できます)。

プロトタイプの主な用途は、持っていることです。

var myExample = new Example(); 
myExample.add() => call the add function of the prototype with this = myExample. 

EDIT:関数はオブジェクトなので、プロトタイプに関数を割り当てること(あなたはまだ機能することができ、それにプロパティを追加することができます)動作するはずです。しかし、私はそれを行うための有用なユースケースを見ていません

+0

関数はオブジェクトです –

+0

私はExample.prototype.add = function();を定義することができます。およびExample.prototype.sub = Var;つまり、プロトタイプはオブジェクトが存在するコンテナのように機能していますか? Example.prototype = function(){}は、一度に1つのオブジェクトまたは関数のみになりますか? –

+0

ハレの答えに感謝しました。ありがとうございました。 –

0

関数オブジェクトでプロトタイプを上書きするだけです。オブジェクトの属性を検索するnew Exampleを使用して作成したときに呼び出されませんが、それは他のプロトタイプオブジェクトとして動作します、そしてあなたはそれが

Example.prototype.foo = 8; 
console.log(new Example().foo); // 8 
関連する問題