【问题标题】:Object prototype in JavaScript [duplicate]JavaScript中的对象原型[重复]
【发布时间】:2015-07-31 18:53:03
【问题描述】:

我尝试了以下代码sn-p:

var man = new Object();
man = {sex : 'male'}
var child = new Object(man);
child.firstName = 'foo'
child.lastName = 'bar'
Object.getPrototypeOf(child);

这将返回 Object {},而我希望它返回与 man 关联的对象。不过这个sn-p:

var man = Object.create(null);  
man = {sex : 'male'}
var child = Object.create(man);  
child.firstName = 'foo'  
child.lastName  = 'bar'

Object.getPrototypeOf(child);

它确实返回与 man 关联的对象。从概念上讲,我哪里错了?

【问题讨论】:

  • 这有什么问题?
  • var man = new Object(); 不会为您做任何事情;之后立即用对象文字替换该值。就像你做var man = { sex: 'male' };

标签: javascript object prototypal-inheritance prototype-programming


【解决方案1】:

差异的原因在于它被指定为做什么。 Object 构造函数只是将它的参数强制转换为一个对象——它不对原型做任何事情:

当没有参数或只有一个参数值调用 Object 构造函数时,将采取以下步骤:
1. 如果提供值,则
一种。如果 Type(value) 是 Object,那么
一世。如果该值是本机 ECMAScript 对象,则不要创建新对象而只是返回值。 http://es5.github.io/#x15.2.2.1

另一方面,Object.create 设置原型:

  1. 如果Type(O) 不是ObjectNull,则抛出TypeError 异常。
  2. 让 obj 成为创建新对象的结果,就好像通过表达式 new Object() 其中 Object 是具有该名称的标准内置构造函数
  3. 将obj的[[Prototype]]内部属性设置为O。
    http://es5.github.io/#x15.2.3.5

【讨论】:

    【解决方案2】:

    我认为概念上的误解在于您认为new Object() 所做的事情。如果您将一个对象传递给new Object(),则新对象将具有该对象所具有的任何属性。但是,它不会使用原始对象的原型创建新对象,它只是获取每个属性并将其添加到新创建的对象中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      相关资源
      最近更新 更多