Ответ 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"
}