javascript - 原型(prototype)编程中的对象和原型(prototype)有什么区别?

标签 javascript oop prototypal-inheritance prototype-programming

我试图理解创建和使用对象的“JavaScript 方式”,我认为我遇到了对对象和原型(prototype)的误解。

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

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

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

var jindo = Object.create(dog);
jindo.color = 'white';

或者如果我应该创建一种类并使用 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;

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

哪种方法更符合原型(prototype)编程的“精神”?还是我完全错过了重点?

最佳答案

prototype只是对象具有隐式引用的另一个对象。

当你这样做时:

var obj = Object.create( some_object );

...你是说你想要obj尝试从 some_object 获取属性, 当它们在 obj 上不存在时.

因此,您的第二个示例将更接近您使用它的方式。使用 Object.create(Dog) 创建的每个对象将在其原型(prototype)链中具有 Dog目的。因此,如果您对 Dog 进行更改,更改将反射(reflect)在具有 Dog 的所有对象中在链中。

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

如果你这样做:
var lab = Object.create(Dog);
lab.color = 'golden';

...您现在正在跟踪 color位于 Dog 的房产,因此您将不再获得 null .你没有改变Dog无论如何,所以如果我创建另一个对象:
var colorless_dog = Object.create(Dog);

...这个仍然会得到null访问 color 时原型(prototype)链中的值属性(property)。
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"
                                       }

关于javascript - 原型(prototype)编程中的对象和原型(prototype)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7558872/

相关文章:

Swift:func返回类型继承类并符合一个或多个协议(protocol)

javascript - 在选项卡更改时切换内容

c++ - 尽管可见,但未设置静态变量

javascript - 非递归替换内置的javascript函数

java - switch 语句是 Java 中实现运算符解释的最快方法吗

javascript - 在 JS 控制台 Chrome 中看不到对象的原型(prototype)

javascript - 如何在javascript中获取实际的类类型

javascript - 是否有更简单的方法来检索原型(prototype)链中某处的 getter 和 setter 方法?

javascript - 如何在 jasmine 中测试 javascript Promise 函数

javascript - 从多个相同文本中查找选定的文本