【问题标题】:Does Object.defineProperty check if the property is defined?Object.defineProperty 是否检查属性是否已定义?
【发布时间】:2012-12-03 10:33:34
【问题描述】:


我需要为 javascript 对象定义属性。
var obj = {};
obj['prop1'] = 1


通过上述方式,我们可以定义属性。
现在,让我们使用Object.defineProperty
var obj = {}; Object.defineProperty(obj,'prop1',{value:1});
这是另一种方式。

两者有什么区别?
Object.defineProperty 是否检查属性是否已定义?
我相信obj['prop1'] = 1 会检查该属性
谢谢 :)

编辑
它们之间有任何性能差异吗?

【问题讨论】:

    标签: javascript json object properties


    【解决方案1】:

    直接对象访问和Object.defineProperty 都不会“检查”现有属性。这两者之间的唯一区别是修改属性描述符值的可能性。

    属性描述符是

    • 可枚举
    • 可配置
    • 可写

    使用直接属性访问将它们全部设置为true。使用Object.defineProperty,您可以选择单独设置这些属性。我建议您阅读此MDN article 以了解其含义。

    例如,如果某个属性拥有标志 configurable=false,则您不能覆盖或删除它(您的问题可能就是这种情况)。


    关于性能:

    由于Object.defineProperty 是一个每次都需要执行的函数,它必须比直接访问对象要慢。我创建了这个小基准:

    http://jsperf.com/property-access-with-defineproperty

    但是,即使看起来差异很大,您也可能不会忘记Object.defineProperty 的价值和原因。

    【讨论】:

    • @DisplayName:我添加了一个新部分。
    • @jAndy——虽然 MDN 是很好的示例,但语言特性的权威参考是 ECMA-262
    • @RobG:我想这在很大程度上取决于具体情况。 ECMA 参考书写得非常正式和规范,而 MDN 以更自然的方式阅读。在这种情况下,MDN 足以解释事物的本质,但如果您正在寻找真正的规范交易,我会同意。
    【解决方案2】:

    Mozillasays:

    当属性已经存在时,Object.defineProperty() 会尝试根据描述符中的值和对象的当前配置来修改属性。如果旧描述符的可配置属性设置为 false(该属性被称为“不可配置”),则除可写之外的任何属性都不能更改。在这种情况下,也无法在数据和访问器属性类型之间来回切换。

    如果一个属性是不可配置的,它的可写属性只能更改为false。

    除非当前值和新值相同,否则尝试更改不可配置属性(除了可写属性)时会引发 TypeError。

    【讨论】:

      【解决方案3】:

      在这两种情况下,如果属性存在,则其值将被覆盖,否则将被创建

      【讨论】:

        猜你喜欢
        • 2013-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 2015-09-26
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        相关资源
        最近更新 更多