4

参考下面的 JavaScript 代码片段,问题:

  1. 为什么对象字面量 {item: {value: "foobar"}} 在分配给变量时(如第 1 行)与作为参数传递给 Object.create() 时的行为不同(如第 5 行)?

  2. 第 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>
4

2 回答 2

2

发生这种情况是因为根据此参考:https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

Object.create接收带有“属性描述符”作为第二个参数的对象,而不是普通key:value对。

有关属性描述符的描述,请参阅此博客文章: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
于 2012-08-18T03:34:04.187 回答
0
  1. 在第 1 行中,您的对象字面量按字面意思解释并按您通常期望的方式实例化。

    而在第 5 行中,您的对象字面量是按字面意思解释的,但被传递到 Object.create 函数中,其中实例化的对象被视为“包含属性描述符的属性对象”。

  2. 因为 Object.create 函数希望它的第二个参数遵循“属性对象”约定,所以您的第二个参数(第 8 行)无效(导致 Chrome 中的类型错误)。

以下片段可能有助于说明:

var PrototypeObj = { item: 'xxx' };

var PropertiesObj = {
  propertyDescriptor1: {
    value: "prop1value",
    writable: true,
    enumerable: true,
    configurable: true
  },
  propertyDescriptor2: {
    value: "prop2value",
    writable: true,
    enumerable: true,
    configurable: true
  }
};

var Obj = Object.create(PrototypeObj, PropertiesObj);

这些文章更详细: Object.createObject.defineProperty

于 2012-08-18T04:13:00.683 回答