Javascript 在原型编程中,对象和原型之间有什么区别?
我试图理解创建和使用对象的“JavaScript方式”,我想我遇到了对对象和原型的误解 在我开始的一个新项目中,我决定尝试原型继承。如果这意味着我应该创建一个我想要使用的对象,然后使用Javascript 在原型编程中,对象和原型之间有什么区别?,javascript,oop,prototypal-inheritance,prototype-programming,Javascript,Oop,Prototypal Inheritance,Prototype Programming,我试图理解创建和使用对象的“JavaScript方式”,我想我遇到了对对象和原型的误解 在我开始的一个新项目中,我决定尝试原型继承。如果这意味着我应该创建一个我想要使用的对象,然后使用object.create()创建基于该对象的其他对象,我会感到困惑,例如: var labrador = { color: 'golden', sheds: true, fetch: function() { // magic } }; var jindo = Obj
object.create()
创建基于该对象的其他对象,我会感到困惑,例如:
var labrador = {
color: 'golden',
sheds: true,
fetch: function()
{
// magic
}
};
var jindo = Object.create(dog);
jindo.color = 'white';
或者我是否应该创建一种类,并使用Object.create()
创建该类的实例
在基于类的OOP方面有了更多的经验,后一种方法对我来说更舒服(也许这就足够了)。但我觉得原型继承的精神更多地体现在第一种选择中
哪种方法更符合原型编程的“精神”?还是我完全没有抓住要点?原型只是一个对象
它是另一个对象用作原型的任何对象。原型
只是另一个对象的隐式引用
当您这样做时:
var obj = Object.create( some_object );
…您的意思是希望obj
尝试从某些对象
获取属性,而这些属性在obj
上不存在
因此,您的第二个示例将更接近您使用它的方式。使用object.create(Dog)
创建的每个对象都将在其原型链中包含Dog
对象。因此,如果对Dog
进行更改,该更改将反映在链中包含Dog
的所有对象上
如果主对象的属性与原型对象上存在的属性相同,则该属性将隐藏原型的该属性。例如,在Dog
的属性上设置的null
值
如果您这样做:
var lab = Object.create(Dog);
lab.color = 'golden';
…您现在正在对Dog
上的color
属性进行阴影处理,因此您将不再获得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"
}
这些说法在技术上是正确的。然而,他们没有帮助回答这个问题,所以-1@delnan-我想是这样的。当我提供我的答案时,没有其他答案。我没有时间进行充分的讨论,所以我提供了理解主题所需的核心概念。谢谢,这很有帮助。在第一个示例中,似乎没有任何东西一定会违背原型编程的“精神”,但维护它可能会很痛苦。@donut:在第一个示例中,这取决于什么是dog
。如果你打算使用拉布拉多
,并且拉布拉多
在其原型链中有狗
,并且所有拉布拉多
都是颜色:
和棚:真
,那么,是的,这样做是有意义的。您可以将原型链扩展到多个对象,只要有意义。如果fetch()
应该应用于所有dog
s,那么在dog
上使用它比在labrador
上更合理。
// 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"
}