javascript Object.create:“直接”设置属性与设置在propertiesObject中声明的属性

时间:2019-03-13 10:20:52

标签: javascript javascript-objects

如果在其他地方提出这个要求,或者我错过了文档中的一些重要内容,我事先表示歉意,但是我需要问一下:

比方说,创建对象时未定义各自的属性

cons objA = Object.create({
  init(text) {
    this.text = text;
  }
});

或正在创建一个对象,并且已在属性对象中声明了相应的属性

const objB = Object.create({
  init(text) {
    this.text = text;
  }
}, {
  text: {
    value: '',
    writable: true
  }
});

我了解在Object.create的propertiesObject中定义属性有助于定义和提供更好的合同,

但是

这两种情况在 text 属性方面是否有所不同?

1 个答案:

答案 0 :(得分:0)

是的,它们有所不同- a b 结果之间存在差异

const a = Object.create({
  init(text) {
    this.text = text;
  }
});

const b = Object.create({
  init(text) {
    this.text = text;
  }
}, {
  text: {
    value: '',
    writable: true
  }
});

console.log(Object.getOwnPropertyNames(a))
console.log(Object.getOwnPropertyNames(b))

a.init('a text'); 
b.init('b text'); 

console.log(Object.getOwnPropertyDescriptor(a, 'text')) 
console.log(Object.getOwnPropertyDescriptor(b, 'text')) 

a 返回:

{
      "value": "a text",
      "writable": true,
      "enumerable": true,
      "configurable": true
}

b 返回:

{
      "value": "b text",
      "writable": true,
      "enumerable": false,
      "configurable": false
}

除非您通过enumerableconfigurable定义属性,否则默认属性为Object.definePropertyObject.create。您可以像使用writable一样定义它们。

可枚举适用于某些对象属性枚举,例如for..in。

可配置表示您无法在该属性上再次使用Object.defineProperty(将出现Cannot redefine property: text错误)。

除此之外-在您使用init()之前-一个对象将具有undefined text属性(该属性不可编号,不可配置,不可写)并且对象 b 将没有任何属性。