В чем разница между объектом и прототипом в прототипном программировании? - PullRequest
21 голосов
/ 26 сентября 2011

Я пытаюсь понять "способ JavaScript" создания и использования объектов, и я думаю, что столкнулся с неправильным пониманием объекта и прототипа.

В новом проекте, который я началЯ решил попробовать прототип наследования.Я запутался, если это означает, что я должен просто создать объект, который я намереваюсь использовать, а затем создать другие объекты на основе этого, используя Object.create(), например:

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

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

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

Или если я должен создать видclass и которые создают экземпляры этого, используя 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;

Имея гораздо больший опыт в ООП на основе классов, последний метод мне кажется более удобным (и, может быть, это достаточная причина).Но я чувствую, что дух наследования прототипов больше относится к первому варианту.

Какой метод больше соответствует духу программирования прототипов?Или я полностью упускаю суть?

Ответы [ 2 ]

14 голосов
/ 26 сентября 2011

prototype - это просто еще один объект, на который объект имеет неявную ссылку.

Когда вы делаете:

var obj = Object.create( some_object );

... вы говорите, что хотите, чтобы obj попытался получить свойства из some_object, когда они не существуют в obj.

Таким образом, ваш второй пример будет ближе к тому, как вы его используете. Каждый объект, созданный с использованием Object.create(Dog), будет иметь в своей цепочке прототипов этот Dog объект. Поэтому, если вы внесете изменение в Dog, оно будет отражено во всех объектах, которые имеют Dog в цепочке.

Если главный объект имеет то же свойство, которое существует у объекта-прототипа, это свойство равно shadowing этому свойству прототипа. Примером этого могут быть 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"
                                       }
2 голосов
/ 26 сентября 2011

Прототип - это просто объект.

Это любой объект, который другой объект использует в качестве прототипа.

...