0

我想了解更多关于此处描述的属性属性的使用:http: //www.ecma-international.org/ecma-262/5.1/#sec-8.6.1

我可以想象这些属性的用例,但它们非常罕见。此外,可写、可枚举和可配置属性默认设置为 false ,但大多数情况下我希望这些值true,所以我必须设置它们。为什么它们默认为假?

制作对象并设置其属性对我来说是非常基本的事情。现在有属性描述符,我可以将其描述为人工的、不自然的、复杂的或不舒服的。也许我只是错过了一些非常重要的东西。

所以我的问题是:属性属性的主要目的是什么。我们如何使用它们?

我可以避免使用属性描述符吗?例如,有一些可以为我设置属性的好模式?例如,如果我将 Object.create 与第二个参数“Properties”一起使用,它会强制我使用属性描述符。那么我应该避免使用它吗?

4

2 回答 2

2

“......主要是我希望这些值是真实的,所以我必须设置它们。”

仅当您需要它们时。如果你不这样做,那么只需使用典型的对象文字语法,或新属性的赋值运算符。

“为什么他们默认是假的?”

我想这是因为已经有一种可用的语法将它们默认为true.

“制作对象并设置它的属性对我来说是非常基本的事情。现在有属性描述符......

什么也没有变。它和以前一样基本。如果您需要,还有更多工具可供您使用。

“……我可以形容为人工的、不自然的、复杂的或不舒服的。”

语法可能有点麻烦,但如果你不喜欢它,就不要使用它。如果您需要将属性描述符设置为 以外的其他true内容,那么我认为您会很高兴拥有新功能,而不管其语法如何。

此外,在 ECMAScript 6 中,可能会将属性描述符定义添加到对象字面量语法中。

“所以我的问题是:属性属性的主要用途是什么。我们如何使用它们?”

这应该是不言自明的。它们用于手动配置对象属性的configurablewriteableenumerable设置。如果您遇到需要其中一种设置的情况,您将使用它们。

“我可以避免使用属性描述符吗?”

当然。同样,一切都没有改变。如果您需要它们,它们就在那里。如果您不这样做,请忽略它们。

“例如,一些可以为我设置属性的好模式?”

不确定你的意思,但如果你想要不同的默认值,只需使用辅助函数,例如:

function addWriteable(obj, prop, value) {
    return Object.defineProperty(obj, prop, {
        writeable: true
    });
}
于 2013-04-29T12:52:39.707 回答
1

可写的默认值是false仅当

如果本规范没有为命名属性明确指定属性的值

例如,对于您手动定义的属性true。您应该注意的是,没有任何规范的 ecmascript 本身与 javascript/jscript 方言之间存在巨大差异。

无论哪种方式,通常你都不应该对这些属性做任何事情,除非你正在考虑制作一个框架或任何类似的东西。例如,prototype.js 可以使用它来设置Enumerablefalse而我自己使用它来重新定义Get以允许开发人员更容易使用的一些外来语法(类似于不同的本机语法),但是在做正常的事情时你不需要它。

于 2013-04-29T12:18:50.633 回答