为什么这个代码:
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)
如果未传递值(或显式传递基元undefined或null),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)
| 归档时间: |
|
| 查看次数: |
880 次 |
| 最近记录: |