参考下面的JavaScript代码片段,问题:
为什么对象字面量 {item: {value: "foobar"}} 在分配给变量时(如第 1 行)与作为参数传递给 Object.create() (如第 5 行)时的行为不同?
第 5 行和第 8 行有什么区别 - 即为什么第 5 行是将第二个参数传递给 Object.create() 的正确方法,而不是第 8 行(覆盖委托中的 item 属性)?
代码片段:
1 var obj = {item: {value: "foobar"}};
2 console.log(obj.item); // [object Object]
3 console.log(obj.item.value); // foobar
4 var delegate = {item: "xxx"};
5 var obj1 = Object.create(delegate, {item: {value: "foobar"}});
6 console.log(obj1.item); // foobar
7 console.log(obj1.item.value); // undefined
8 var obj2 = Object.create(delegate, {item: "bar"});
9 console.log(obj2.item); // <nothing>
发生这种情况是因为根据此参考:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create
Object.create
接收一个以“属性描述符”作为第二个参数的对象,而不是简单的key:value
pairs.
请参阅这篇博文:http://ejohn.org/blog/ecmascript-5-objects-and-properties/有关属性描述符的描述。
属性描述符是一个对象,它描述每个属性,而不仅仅是属性值。从你的代码片段来看:
2 obj.item // [object Object] since item is the object {value:"foobar¨}
6 obj1.item // foobar, the descriptor says that the value
// of item is "foobar"
7 obj1.item.value // undefined since item="foobar", value is part of
// the object that describes "item" not item itself
9 obj2.item // nothing because the descriptor that you passed
// for item is incomplete
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)