我尝试了以下代码段:
var man = new Object();
man = {sex : 'male'}
var child = new Object(man);
child.firstName = 'foo'
child.lastName = 'bar'
Object.getPrototypeOf(child);
这会返回 Object {} ,而我希望它返回与 man 相关联的对象。但是,这个片段:
var man = Object.create(null);
man = {sex : 'male'}
var child = Object.create(man);
child.firstName = 'foo'
child.lastName = 'bar'
Object.getPrototypeOf(child);
它确实返回与 man 相关联的对象。从概念上讲,我哪里出错?
答案 0 :(得分:2)
区别的原因在于它是指定要做的事情。 Object
构造函数只是将其参数强制转换为对象 - 它对原型没有任何作用:
另一方面,当调用Object构造函数时没有参数或带有一个参数值时,采取以下步骤:
1.如果提供了价值,那么
一个。如果Type(value)是Object,那么
一世。如果值是本机ECMAScript对象,则不要创建新对象,只需返回值。 http://es5.github.io/#x15.2.2.1
Object.create
设置原型:
- 如果
Type(O)
不是Object
或Null
则会引发TypeError
例外。- 让obj成为创建新对象的结果,就像表达式
new Object()
一样Object
是具有该名称的标准内置构造函数- 将obj的
醇>[[Prototype]]
内部属性设置为O.
http://es5.github.io/#x15.2.3.5
答案 1 :(得分:1)
我认为概念上的误解在于你认为new Object()
的作用。如果将对象传递给new Object()
,则新对象将具有该对象具有的任何属性。但是,它不会使用原始对象的原型创建新对象,只需获取每个属性并将其添加到新创建的对象中。