Object.defineProperty是否检查属性是否已定义?

时间:2012-12-03 10:33:35

标签: javascript json object properties


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


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

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

修改
那些之间有任何性能差异吗?

3 个答案:

答案 0 :(得分:6)

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

属性描述符是

  • 枚举
  • 配置
  • 可写

使用直接属性访问设置为true。使用Object.defineProperty,您可以选择单独设置这些属性。我建议你阅读MDN articl e来了解其含义。

例如,如果属性拥有标记configurable=false,则无法覆盖或删除它(可能是您的问题)。


关于表现:

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

Mozilla says

  

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

     

如果属性不可配置,则其可写属性只能更改为false。

     

当尝试更改不可配置的属性属性(除了可写属性)时,抛出TypeError,除非当前值和新值相同。