22

オブジェクトを作成および使用する「JavaScript の方法」を理解しようとしていますが、オブジェクトとプロトタイプの誤解に遭遇していると思います。

私が始めた新しいプロジェクトでは、プロトタイプの継承を試すことにしました。Object.create()これが、使用する予定のオブジェクトを作成し、それに基づいて次のようなオブジェクトを作成する必要があることを意味する場合、私は混乱しています。

var labrador = {
   color: 'golden',
   sheds: true,

   fetch: function()
   {
      // magic
   }
};

var jindo = Object.create(dog);
jindo.color = 'white';

または、一種のクラスを作成する必要があり、そのインスタンスを使用してそのインスタンスを作成する必要がある場合Object.create()

var Dog = { // Is this class-like thing a prototype?
   color: null,
   sheds: null,

   fetch: function()
   {
      // magic
   }
};

var labrador = Object.create(Dog);
labrador.color = 'golden';
labrador.sheds = true;

var jindo = Object.create(Dog);
jindo.color = 'white';
jindo.sheds = true;

クラスベースの OOP でより多くの経験を積むと、後者の方法がより快適に感じられます (そして、それで十分な理由かもしれません)。しかし、プロトタイプの継承の精神は、最初の選択肢にあるように感じます。

プロトタイプ プログラミングの「精神」に近い方法はどれですか? それとも私はポイントを完全に見逃していますか?

4

2 に答える 2

15

prototype、オブジェクトが暗黙的に参照するもう1つのオブジェクトです。

あなたがするとき:

var obj = Object.create( some_object );

...プロパティがに存在しない場合に、objからプロパティをフェッチしようとしていると言っています。some_objectobj

そのため、2番目の例は、使用方法に近いものになります。を使用して作成されたすべてのオブジェクトはObject.create(Dog)、そのプロトタイプチェーンにそのDogオブジェクトを持ちます。したがって、に変更を加えるとDog、その変更はチェーン内にあるすべてのオブジェクトに反映されますDog

メインオブジェクトがプロトタイプオブジェクトに存在するものと同じプロパティを持っている場合、そのプロパティはプロトタイプのそのプロパティをシャドウイングしています。その一例は、のnullプロパティに設定する値ですDog

もし、するなら:

var lab = Object.create(Dog);
lab.color = 'golden';

...colorプロパティをシャドウイングしているDogので、は取得できなくなりますnull。あなたは決して変わっていないDogので、私が別のオブジェクトを作成した場合:

var colorless_dog = Object.create(Dog);

...これは、プロパティnullにアクセスするときにプロトタイプチェーンから値を取得しcolorます。

colorless_dog.color;  // null

...あなたがそれをシャドウイングするまで:

colorless_dog.color = 'blue';
colorless_dog.color;  // 'blue'

だからあなたの例を考えると:

var lab = Object.create(Dog);
lab.color = 'golden';
lab.sheds = true;

...次のようになります。

              // labrador              // Dog
lab.color---> color:'golden'           color:null
lab.sheds---> sheds:true               sheds:null

lab.fetch()--------------------------> fetch: function() {
                                          alert( this.color ); // 'golden'
                                          // "this" is a reference to the
                                          //    "lab" object, instead of "Dog"
                                       }
于 2011-09-26T18:08:14.557 に答える
3

プロトタイプは単なるオブジェクトです。

これは、別のオブジェクトがプロトタイプとして使用する任意のオブジェクトです。

于 2011-09-26T18:06:37.740 に答える