原型编程中对象和原型有什么区别?

don*_*nut 21 javascript oop prototypal-inheritance prototype-programming

我正在尝试理解创建和使用对象的"JavaScript方式",我认为我遇到了对对象和原型的误解.

在我刚开始的一个新项目中,我决定尝试原型继承.我很困惑,如果这意味着我应该创建一个我打算使用的对象,然后使用如下方法创建其他对象Object.create():

var labrador = {
   color: 'golden',
   sheds: true,

   fetch: function()
   {
      // magic
   }
};

var jindo = Object.create(dog);
jindo.color = 'white';
Run Code Online (Sandbox Code Playgroud)

或者,如果我应该创建一种类,并创建使用它的实例Object.create().

var Dog = { // Is this class-like thing a prototype?
   color: null,
   sheds: null,

   fetch: function()
   {
      // magic
   }
};

var labrador = Object.create(Dog);
labrador.color = 'golden';
labrador.sheds = true;

var jindo = Object.create(Dog);
jindo.color = 'white';
jindo.sheds = true;
Run Code Online (Sandbox Code Playgroud)

在基于类的OOP中有更多的经验,后一种方法对我来说感觉更舒服(也许这是足够的理由).但我觉得原型继承的精神更像是第一选择.

哪种方法更多的是原型编程的"精神"?还是我完全忽略了这一点?

use*_*716 14

prototype只是另一个目的是其中对象具有的隐式引用.

当你这样做时:

var obj = Object.create( some_object );
Run Code Online (Sandbox Code Playgroud)

...你说你想obj尝试从some_object它们不存在时获取属性obj.

因此,你的第二个例子将更接近你使用它的方式.使用的每个对象都Object.create(Dog)将在其原型链中具有该Dog对象.因此,如果您进行更改Dog,更改将反映在Dog链中的所有对象中.

如果主对象具有与原型对象上存在的属性相同的属性,则该属性将隐藏原型的该属性.一个例子就是null你在属性上设置的值Dog.

如果你这样做:

var lab = Object.create(Dog);
lab.color = 'golden';
Run Code Online (Sandbox Code Playgroud)

......你现在正在影响color房产Dog,所以你不会再得到了null.你没有Dog以任何方式改变,所以如果我创建另一个对象:

var colorless_dog = Object.create(Dog);
Run Code Online (Sandbox Code Playgroud)

...... null当访问该color属性时,这个仍然会从原型链中获得价值.

colorless_dog.color;  // null
Run Code Online (Sandbox Code Playgroud)

......直到你影响它:

colorless_dog.color = 'blue';
colorless_dog.color;  // 'blue'
Run Code Online (Sandbox Code Playgroud)

所以举个例子:

var lab = Object.create(Dog);
lab.color = 'golden';
lab.sheds = true;
Run Code Online (Sandbox Code Playgroud)

......它看起来像这样:

              // 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"
                                       }
Run Code Online (Sandbox Code Playgroud)