2012-04-26 10 views
5

私は(「Javascriptを:良い部品」からコピーブック):新しいオブジェクトの作成時に、私はプロトタイプオブジェクトを選択できるようになる方法持っている今、私は、オブジェクトを持っている、と言うJavaScriptのプロトタイプの動作

Object.create = function(o) { 
    var F = function() {}; 
    F.prototype=o; 
    return new F(); 
} 

を:

var car = { 
    model: "Nissan" 
}; 

そして私は、 "作成" 方法使用して、このオブジェクトに基づいて新しいオブジェクトを作成します。

var car1 = Object.create(car); 

を私は車にプロパティを追加することができ、動的にcar1(動的プロトタイピング)に追加されます。だから、例えばのため:

car.year=2011;  // Gets added to "car"... 
alert(car1.year); // ... Is also avaialable to car1 

Q1)この動作は、「年」、それはCAR1に利用可能である理由である車のプロトタイプに追加しまったことを示しています。これは正しいです?そうでない場合、「年」はどこに追加され、なぜ「車」と「car1」の両方に利用できるのですか?

また、オブジェクトのメソッドが見つからない場合は、そのプロトタイプを検索し、Object.prototypeに到達するまでチェーンのすべてのプロトタイプをチェックします。だから、私はこのようなものを入力すれば:

Object.prototype.originCountry = "Japan"; 
alert(car.originCountry); // Outputs Japan 
alert(car1.originCountry); // Outputs Japan 

それほど良い;しかし、私がしなければ:

Object.carColor= "White"; 
alert(car.carColor); // Error! 

Q2)私は「車」(上記 car.year例を参照するプロパティを追加すると、それは車のプロトタイプに追加されますしかし、私はにプロパティを追加する場合。オブジェクトは、それはそれはのプロトタイプオブジェクトに追加されますない場合は?Prototypeのをオブジェクトに追加されません、なぜ代表団のルールごとに、「車」にも使用できません?

は、なぜこの起こっているのでしょうか?

+0

私は、プロトタイプ上にプロパティが作成され、オブジェクト自体からそれらを作成しようとすると、彼は未定義をスローし、そのプロトタイプで作成されたすべての要素それを継承する。 –

+0

あなたのQ2が間違っているから始まり:あなたはcar'のプロトタイプ 'には何も追加しなかった、あなたはこれは私がしようとしているものです – searlea

答えて

5

あなたがこれを行う:

Object.carColor = "White"; 

carColorObjectのプロトタイプに追加されません。現在はObjectの財産です。あなたが期待するものを見るために、何をするだろうことです。その後その後

Object.prototype.carColor = "White"; 

alert(({}).carColor); // Will alert "White" 

だから何がここで起こることがあります。 {}(空のオブジェクトだけである)を含むオブジェクトはすべてObjectの新しいインスタンスであるため、プロトタイプObjectに設定されているもののプロパティを共有します。

Object.createの機能については、

1. var F = function() {}; 

本来、空白のオブジェクトである新しい関数を作成するだけです。 {}のようなものではなく、関数を使用する理由は、関数がnew呼び出しと結合してそのオブジェクトの新しいインスタンスを作成し、その関数がコンストラクタとして機能するためです。

2. F.prototype=o; 

新しい空白関数のプロトタイプを、作成したオブジェクトに設定します。さて、これは純粋に参考になります。ディープコピーではありません。つまり、オブジェクトoが変更されると、オブジェクトのインスタンスも変更されます(実際には変更されませんが、変更されたように見えますが、後で詳しく説明します)。

3. return new F(); 

これで、渡されたオブジェクトとしてプロトタイプを持つ、その関数の新しいインスタンスを作成するだけです。

あなたは次のようにします。

var car1 = Object.create(car); 

あなたはプロトタイプがcarを持っているオブジェクトcar1を取得します。だから、これを行うとき:

car.year = 2011 

それは、car1変化を好まれていません。これは、プロトタイプが変更を参照するオブジェクトによく似ています。だからあなたのような何かをするとき:

car1.year 

検索を(、最初のプロトタイプで、オブジェクトで)行わyearというプロパティのためと判明し、試作品がそれを持っているので、car1.year2011を返します。

だから、一番下の行はこれです:プロトタイプのインスタンス間で共有されて

  1. 。変更任意のインスタンスに現れないであろうObjectの特性を変更
+0

(car''であることを起こる)car1'のプロトタイプ 'にこれを追加しましたわかる。あなたの投稿で、あなたは言った: [引用] あなたはプロトタイプは車を持っているオブジェクトCAR1を取得します。だから、あなたがこれを行うとき: car.year = 2011 をそれはCAR1の変​​更のようではありません。これは、プロトタイプが変更を参照するオブジェクトによく似ています。 [/引用] 私は「車」(car.prop =値)に何かを追加すると、なぜそれがそのプロトタイプに追加されますんが、私はオブジェクトに同じことを行うとき、それはしていません。基本的に何が起こっている @Bergi –

+0

はcar1.prototype'がcar' '以外の何ものでもないので、' 'car.year =が2011'今car1.prototype.year = 2011''言うのと等価であるということです。 –

+0

これに関する知識が不足していますが、なぜcar1.prototype ===車ですか? "create"関数は、新しいオブジェクトのプロトタイプを既存のオブジェクトに設定するだけです(この場合、car1のプロトタイプがcar1を指す) –

1

最初の例では、car1bのプロトタイプに追加していますcar === F.prototypeおよびcar1 instanceof F。だからQ1へ:はい。

Objectは、すべてのオブジェクトのコンストラクタ関数です。Fは、car1です。 Object.prototypeに何かを追加すると、すべてのオブジェクトで利用できるようになります。そうしなければならない理由は、このような列挙できないプロパティがすべてのfor-in-loopsを混乱させるからです。 Objectコンストラクタ関数のプロパティを設定すると、それを継承するものは何も変わりません。 ObjectF関数と同じで、プロトタイプ設定のパラメータはoではありません。 new Object()は、Object.create(Object.prototype)と同じです。

0

この関数は、プロトタイプオブジェクトを選択することはできません。この関数は、nmewオブジェクトコンストラクタを作成し、オブジェクト引数をプロトタイプとして作成し、コンストラクタに基づいて新しいオブジェクトを返します。

この新しいオブジェクトは、オブジェクトの引数からメソッドとプロパティを継承します。これは、他人から継承する新しいオブジェクトの作成を可能にするためです。最初のが延びるため

この動作(及び方法によって、オブジェクトがコアJavaScriptのオブジェクトであり、拡張されるべきではない)理由

Object.prototype.originCountry = "Japan"; 
alert(car.originCountry); // Outputs Japan 
alert(car1.originCountry); 

これは

Object.carColor= "White"; 

ないですObjectのプロトタイプオブジェクトです。つまり、Objectコンストラクタを使用したオブジェクト構築は、それらのメソッドとプロパティを継承します。

これは、Objectコンストラクタから作成されたオブジェクトに渡されない静的関数と呼ばれるものです。

Javascriptでプロトタイプの継承についてもっと読むことをお勧めします。ここにはいくつかのリンクがあります。

http://www.webreference.com/programming/javascript/prototypal_inheritance/index.html http://www.htmlgoodies.com/html5/tutorials/javascript-prototypical-inheritance-explained.html#fbid=xEJ2PwtH2Oh

http://unscriptable.com/2007/04/17/inheritance-explained/

関連する問題