3


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


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

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

编辑
它们之间的任何性能变化?

4

3 回答 3

7

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

属性描述符是

  • 可枚举的
  • 可配置
  • 可写

这些都是true通过使用直接属性访问设置的。Object.defineProperty您可以选择单独设置这些属性。我建议你阅读这篇MDN 文章以了解其含义。

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


关于性能:

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

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

但是,即使差异看起来很大,您也可能不会忘记Object.defineProperty.

于 2012-12-03T10:36:07.563 回答
1

Mozilla

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

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

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

于 2012-12-03T10:37:00.493 回答
1

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

于 2012-12-03T10:39:26.743 回答