javascript Object.create丢失属性

时间:2019-01-29 18:23:29

标签: javascript javascript-objects

我有点迷茫和/或太天真了。我想用一个原型对象创建一个对象,该对象包含一个函数,该函数将一个值添加到作为属性创建的列表中。

但是似乎Object.create忽略了属性的创建。至少,我就是这么做的。

我没有得到什么?

这是一个例子:

const proto = {
  add(s) {
    this.list.push(s);
  }
}
const props = {
  list: []
}
const newObj = Object.create(proto, props);

console.log('newObj', newObj);
// What happendened to the list property?

newObj.add('test');
// due to undefined list-Property
// an error is being thrown

2 个答案:

答案 0 :(得分:2)

问题在于properties对象必须以特定方式设置格式。看到这里:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Syntax

  

这些属性对应于Object.defineProperties()的第二个参数。

您可以这样做:

const props = {
  list: {
      value: []
  }
}

这是定义属性的最明确的方法,并且有一些interesting effects。但是除非您需要如此笨拙,否则我建议您这样做:

newObj.list = []

答案 1 :(得分:0)

来自MDN

  

propertiesObject

     

可选。如果指定且未定义,则其可枚举的自身属性(即,在其自身上定义的那些属性,而不是其原型链上不可枚举的属性)的对象会指定要添加到新创建的对象的属性描述符,以及相应的属性名称。这些属性对应于Object.defineProperties()的第二个参数。

Object.defineProperties的参数形式为:

{
   propName: {
     get: function() {},
     set: function() {},
     value: Any
     writable: true,
     enumerable: true,
     configurable: true,
   }
}

请注意,您可以让 一个getter / setter 一个值。