我需要为javascript对象定义属性
var obj = {};
obj['prop1'] = 1
以上述方式,我们可以定义属性。
现在,让我们使用Object.defineProperty
var obj = {};
Object.defineProperty(obj,'prop1',{value:1});
这是另一种方式。
两者有什么区别?
Object.defineProperty
检查属性是否已定义?
我相信obj['prop1'] = 1
检查财产
谢谢:)
的修改
那些之间有任何性能差异吗?
答案 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,除非当前值和新值相同。