The prototype
只是一个对象具有隐式引用的另一个对象。
当你这样做时:
var obj = Object.create( some_object );
……你是说你想要obj
尝试从中获取属性some_object
,当它们不存在时obj
.
因此,您的第二个示例将更接近您的使用方式。使用创建的每个对象Object.create(Dog)
将在其原型链, that Dog
目的。所以如果你做出改变Dog
,更改将反映在所有具有Dog
在链中。
如果主对象具有与原型对象相同的属性,则该属性是影子原型的该属性。一个例子是null
您在属性上设置的值Dog
.
如果你这样做:
var lab = Object.create(Dog);
lab.color = 'golden';
...你现在正在跟踪color
属性于Dog
,所以你将不再得到null
。你是not改变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"
}