我想更多地了解这里描述的属性属性的用法: http://www.ecma-international.org/ecma-262/5.1/#sec-8.6.1
我可以想象这些属性的用例,但它们非常罕见。 此外,默认情况下,可写,可枚举和可配置属性设置为false,但大多数情况下我希望这些值 true ,因此我必须设置它们。为什么他们默认是假的?
创建对象并设置其属性对我来说是非常基本的事情。现在有属性描述符,我可以描述为人工,不自然,复杂或不舒服。也许我只是错过了非常必要的东西。
所以我的问题是:属性属性的主要目的是什么。我们如何使用它们?
我可以避免使用属性描述符吗?例如,有一些好的模式会为我设置属性吗?例如,如果我使用Object.create和第二个参数“Properties”,它会强制我使用属性描述符。我应该避免使用它吗?
答案 0 :(得分:2)
“......大多数情况下我想让这些值成立,所以我必须设置它们。”
只有你需要它们。如果不这样做,那么只需使用典型的对象文字语法或新属性的赋值运算符。
“默认为什么它们是假的?”
我想这是因为已经有一种语法可以将它们默认为true
。
“创建对象并设置其属性对我来说是非常基本的东西。现在有属性描述符...... ”
没有任何改变。它和以前一样基本。如果您需要,可以使用更多工具。
“...我可以描述为人为的,不自然的,复杂的或不舒服的。”
语法可能有点麻烦,但如果您不喜欢它,请不要使用它。如果您需要将属性描述符设置为true
之外的其他内容,那么无论语法如何,我都认为您很乐意拥有新功能。
此外,ECMAScript 6中可能会将属性描述符定义添加到对象文字语法中。
“所以我的问题是:属性属性的主要目的是什么。我们如何使用它们?”
这应该是不言自明的。它们用于在对象上手动配置属性的configurable
,writeable
和enumerable
设置。如果您遇到需要其中一种设置的情况,您将使用它们。
“我可以避免使用属性描述符吗?”
当然。再一次,没有任何改变。如果你需要它们,它们就在那里。如果你不这样做,那就忽略它们。
“例如,有一些好的模式可以为我设置属性吗?”
不确定你的意思,但如果你想要不同的默认值,只需使用辅助功能,如:
function addWriteable(obj, prop, value) {
return Object.defineProperty(obj, prop, {
writeable: true
});
}
答案 1 :(得分:1)
只有
时,可写的默认值为false
如果此规范未为命名属性
明确指定属性的值
对于您手动定义的属性,例如true
。你应该注意的是,ecmascript本身之间没有任何规范和javascript / jscript方言之间存在巨大差异。
无论哪种方式,通常你都不应该对这些属性属性做任何事情,除非你正在考虑制作一个框架或其他任何东西。例如,prototype.js可以使用它将Enumerable
设置为false
,我自己用它来重新定义Get
以允许一些异国语法,这对开发人员来说更容易使用(类似于不同的原生语法),但在做正常的事情时你不需要它。