JavaScript-将对象文本作为第二个参数传递给object.create()

JavaScript-将对象文本作为第二个参数传递给object.create(),javascript,object-literal,Javascript,Object Literal,参考下面的JavaScript代码片段,问题如下: 当将对象文本{item:{value:“foobar”}赋值给变量(如第1行)时,与作为object.create()的参数传递时,对象的行为为何不同(如第5行) 第5行和第8行之间的区别是什么?也就是说,为什么第5行是将第二个参数传递给Object.create()而不是第8行(重写委托中的项属性)的正确方法 代码段: 1 var obj = {item: {value: "foobar"}}; 2 console.log(obj.ite

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

  • 当将对象文本{item:{value:“foobar”}赋值给变量(如第1行)时,与作为object.create()的参数传递时,对象的行为为何不同(如第5行)

  • 第5行和第8行之间的区别是什么?也就是说,为什么第5行是将第二个参数传递给Object.create()而不是第8行(重写委托中的项属性)的正确方法

  • 代码段:

     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>
    
    1var obj={item:{value:“foobar”};
    2控制台日志(对象项);//[对象]
    3控制台日志(对象项值);//福巴
    4 var delegate={item:“xxx”};
    5 var obj1=Object.create(委托,{item:{value:“foobar”});
    6控制台日志(obj1.项);//福巴
    7控制台日志(obj1.item.value);//未定义
    8 var obj2=Object.create(委托,{item:“bar”});
    9控制台日志(obj2.item);//
    
    发生这种情况是因为根据此参考:

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

    有关属性描述符的描述,请参阅本文

    属性描述符是描述每个属性的对象,而不仅仅是属性值。从您的代码片段:

    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
    
  • 在第1行中,您的对象文字按照您通常期望的方式进行逐字解释和实例化

    然而,在第5行中,对象文字是字面解释的,但是被传递到object.create函数中,在该函数中实例化的对象被视为“包含属性描述符的属性对象”

  • 由于Object.create函数希望其第二个参数遵循“Properties Object”约定,因此第二个参数(第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);
    
    这些文章更为详细: ,
    非常感谢您的回复,迭戈!我现在明白了。非常感谢你的回复,Richard!我现在明白了。迭戈和理查德都很好地回答了我的问题。我怎么才能把他们两个都归功于呢?还是我只能给一个人信用?