ECMAScript-5中属性属性“功能”的优点是什么?

时间:2013-04-29 12:04:57

标签: javascript ecmascript-5

我想更多地了解这里描述的属性属性的用法: http://www.ecma-international.org/ecma-262/5.1/#sec-8.6.1

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

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

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

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

2 个答案:

答案 0 :(得分:2)

  

“......大多数情况下我想让这些值成立,所以我必须设置它们。”

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

  

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

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

  

“创建对象并设置其属性对我来说是非常基本的东西。现在有属性描述符......

没有任何改变。它和以前一样基本。如果您需要,可以使用更多工具。

  

“...我可以描述为人为的,不自然的,复杂的或不舒服的。”

语法可能有点麻烦,但如果您不喜欢它,请不要使用它。如果您需要将属性描述符设置为true之外的其他内容,那么无论语法如何,我都认为您很乐意拥有新功能。

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

  

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

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

  

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

当然。再一次,没有任何改变。如果你需要它们,它们就在那里。如果你不这样做,那就忽略它们。

  

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

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

function addWriteable(obj, prop, value) {
    return Object.defineProperty(obj, prop, {
        writeable: true
    });
}

答案 1 :(得分:1)

只有

时,可写的默认值为false
  

如果此规范未为命名属性

明确指定属性的值

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

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