如果在其他地方提出这个要求,或者我错过了文档中的一些重要内容,我事先表示歉意,但是我需要问一下:
比方说,创建对象时未定义各自的属性
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 属性方面是否有所不同?
答案 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
}
除非您通过enumerable
或configurable
定义属性,否则默认属性为Object.defineProperty
和Object.create
。您可以像使用writable
一样定义它们。
可枚举适用于某些对象属性枚举,例如for..in。
可配置表示您无法在该属性上再次使用Object.defineProperty
(将出现Cannot redefine property: text
错误)。
除此之外-在您使用init()
之前-一个对象将具有undefined
text
属性(该属性不可编号,不可配置,不可写)并且对象 b 将没有任何属性。