Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在原型编程中,对象和原型之间有什么区别?_Javascript_Oop_Prototypal Inheritance_Prototype Programming - Fatal编程技术网

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

我试图理解创建和使用对象的“JavaScript方式”,我想我遇到了对对象和原型的误解

在我开始的一个新项目中,我决定尝试原型继承。如果这意味着我应该创建一个我想要使用的对象,然后使用
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"
                                       }