Javascript Object.defineProperty是否检查属性是否已定义?
Javascript Object.defineProperty是否检查属性是否已定义?,javascript,json,object,properties,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会检查属性 谢谢:) 编辑 这两者之间有性能差
我需要为javascript对象定义属性。
var obj={}代码>
obj['prop1']=1
通过上面的方法,我们可以定义属性。
现在,让我们使用Object.defineProperty
var obj={}代码>
Object.defineProperty(obj,'prop1',{value:1})代码>
这是另一种方式。
两者之间有什么区别?
Object.defineProperty
是否检查属性是否已定义??
我相信obj['prop1']=1
会检查属性
谢谢:)
编辑
这两者之间有性能差异吗 既不是直接对象访问,也不是对象。defineProperty
将“检查”现有属性。这两者之间的唯一区别是修改属性描述符值的可能性
属性描述符是
- 可枚举
- 可配置
- 可写
通过使用直接属性访问将所有设置为true
。使用Object.defineProperty
可以单独设置这些属性。我建议你读一下这封信,了解一下它的意思
例如,如果某个属性拥有标志configurable=false
,则您无法覆盖或删除它(您的问题可能就是这种情况)
关于业绩:
由于Object.defineProperty
是一个每次都需要执行的函数,因此它必须比直接访问对象慢。我创建了这个小基准:
但是,即使差异看起来很大,您也可能不会忘记对象的值和原因。defineProperty
Mozilla:
当属性已经存在时,Object.defineProperty()会尝试根据描述符中的值和对象的当前配置修改属性。如果旧描述符的可配置属性设置为false(该属性被称为“不可配置”),那么除了可写属性外,其他属性都不能更改。在这种情况下,也不可能在数据和访问器属性类型之间来回切换
如果属性不可配置,则其可写属性只能更改为false
除非当前值和新值相同,否则尝试更改不可配置的属性属性(除可写属性外)时会引发TypeError
在这两种情况下,如果属性存在,它的值将被覆盖,否则它将被创建。@DisplayName:我添加了一个新的部分。@jAndy虽然MDN是一个很好的例子,但语言功能的最终参考是。@RobG:我想这在很大程度上取决于情况。ECMA参考是以非常正式和规范的方式编写的,而MDN以更自然的方式读取。在本例中,MDN足以解释事物的本质,但如果您正在寻找真正的规范交易,我同意。