Подтвердить что ты не робот

В чем разница между объектом и прототипом в прототипном программировании?

Я пытаюсь понять "способ 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;

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

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

4b9b3361

Ответ 1

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

Когда вы выполните:

var obj = Object.create( some_object );

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

Таким образом, ваш второй пример будет ближе к тому, как вы его используете. Каждый объект, созданный с помощью 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);

... при доступе к свойству color этот символ все равно получит значение null из цепи прототипа.

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

Прототип - это всего лишь объект.

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