Object.create(foo)和new Object(foo)之间的区别?

Ben*_*jia 4 javascript

为什么这个代码:

var foo = {one: 1, two: 2};
var bar = new Object( foo );
bar.three = 3;
bar.one = 100; 
document.write(bar.one); //100 
document.write(foo.one); //100
Run Code Online (Sandbox Code Playgroud)

导致bar.one和foo.one都是100,而

var foo = {one: 1, two: 2};
var bar = Object.create( foo );
bar.three = 3;
bar.one = 100; 
document.write(bar.one); //100
document.write(foo.one); //1
Run Code Online (Sandbox Code Playgroud)

只影响bar.one ..

我的第一个直觉是,因为在第一段代码中我们正在为bar指定一个foo引用,那么它意味着更改也将适用于foo,而在第二段代码中,它可能是"从foo继承",因此更改在bar的'子类'属性赢了; t适用于它的'超类'(原型)..

有人可以确认我的假设至少是在正确的轨道上吗?绝对会欣赏任何答案.提前致谢.

CMS*_*CMS 13

这条线:

var bar = new Object( foo );
Run Code Online (Sandbox Code Playgroud)

在你的第一个片段中,它没有做任何事情 - 你的假设是正确的 - 它只会返回对传递给Object构造函数的同一个对象的引用.

这是将本机对象传递给表达式()中的Object构造函数时的行为,如果传递宿主对象,则结果与实现有关.newnew Object(value)

如果未传递值(或显式传递基元undefinednull),Object.prototype则将创建从中继承的新对象.

否则,如果传递任何剩余的基元(作为数字,字符串或布尔值),将创建基本包装器对象(例如,基本上是"基元到对象"类型转换).

var s = new String("foo"); // a string object wrapper
typeof s;     // "object"
s.valueOf();  // "foo"
Run Code Online (Sandbox Code Playgroud)

请参阅有关基元和对象的问题:Javascript字符串如何不是对象?

在你的第二个片段中,行:

var bar = Object.create( foo );
Run Code Online (Sandbox Code Playgroud)

foo在分配属性时,创建一个新对象,该对象继承自该对象,因为它是另一个对象:

bar.three = 3;
bar.one = 100;
Run Code Online (Sandbox Code Playgroud)

这些将在物理上在该分离的实例上创建,如您所见,该bar.one属性会遮蔽其中包含的值foo.

bar事实上,引用的对象将包含两个自己的属性(one并且three,但由于它继承自foo,所以命名的属性two可通过原型链解析,例如:

bar.hasOwnProperty('one'); // true, the property is "own"
bar.hasOwnProperty('two'); // false, the property is "inherited" from foo
bar.two; // 2, is accessible
Run Code Online (Sandbox Code Playgroud)

基本上,原型链bar看起来像这样:

                                                      -----------------
                                           ========> | Object.prototype| ==> null
                                           |          -----------------
|-------------|     [[Prototype]]     |---------|
| one:   100  | ====================> |  one: 1 | (shadowed)
| three: 3    |                       |  two: 2 |
|-------------|                       |---------|

(== line denotes the prototype chain)