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"
}