Object.defineProperty 对比原版 属性
Object.defineProperty vs vanilla property
考虑到基本的使用场景,做
foo.bar = 'baz';
和
Object.defineProperty(foo, 'bar', {
value: 'baz',
configurable: true,
enumerable: true,
writable: true
});
在支持的浏览器中表现完全相同?
我们是否可以仅仅因为有利的语法而在 ES6 之前的应用程序中回退到香草,或者将它们混合使用而没有任何副作用?
是的,当
时它们的行为相同
foo
中没有bar
属性(连继承的都没有),所以新建一个,或者
- 有一个
bar
属性 的 writable
和 configurable
属性设置为 true
但是,如果两者都没有给出,则两者确实会产生略有不同的结果。
defineProperty
不考虑继承属性及其描述符
- 如果现有的(可能是继承的)属性 是访问器,赋值将尝试调用 setter(如果 none 存在则失败),而
definePropery
将用数据描述符覆盖 属性(如果它是自己的、不可配置的,则失败)
- 如果现有的继承属性是一个数据属性,如果
writable
为false,分配将失败,或者如果为true,则创建一个新的属性,比如defineProperty
总是
- 如果已有自己的属性是一个数据属性,如果
writable
为false则赋值失败,如果为true则设置新值,而defineOwnProperty
如果 configurable
为 false 则将失败,否则会覆盖属性。
Considering the basic scenario of usage
如果 "basic usage" 你的意思是不使用花哨的 属性 属性,那么是的,它们是等价的。然而,您应该只使用简单的赋值,因为它们更容易阅读并且执行起来更快。
Can we fall back to vanilla in pre-ES6 applications
请注意,defineProperty
完全支持 ES5,因此除非您需要考虑 ES5 之前的(旧 IE)浏览器,否则您根本不会在意。
考虑到基本的使用场景,做
foo.bar = 'baz';
和
Object.defineProperty(foo, 'bar', {
value: 'baz',
configurable: true,
enumerable: true,
writable: true
});
在支持的浏览器中表现完全相同?
我们是否可以仅仅因为有利的语法而在 ES6 之前的应用程序中回退到香草,或者将它们混合使用而没有任何副作用?
是的,当
时它们的行为相同foo
中没有bar
属性(连继承的都没有),所以新建一个,或者- 有一个
bar
属性 的writable
和configurable
属性设置为true
但是,如果两者都没有给出,则两者确实会产生略有不同的结果。
defineProperty
不考虑继承属性及其描述符- 如果现有的(可能是继承的)属性 是访问器,赋值将尝试调用 setter(如果 none 存在则失败),而
definePropery
将用数据描述符覆盖 属性(如果它是自己的、不可配置的,则失败) - 如果现有的继承属性是一个数据属性,如果
writable
为false,分配将失败,或者如果为true,则创建一个新的属性,比如defineProperty
总是 - 如果已有自己的属性是一个数据属性,如果
writable
为false则赋值失败,如果为true则设置新值,而defineOwnProperty
如果configurable
为 false 则将失败,否则会覆盖属性。
Considering the basic scenario of usage
如果 "basic usage" 你的意思是不使用花哨的 属性 属性,那么是的,它们是等价的。然而,您应该只使用简单的赋值,因为它们更容易阅读并且执行起来更快。
Can we fall back to vanilla in pre-ES6 applications
请注意,defineProperty
完全支持 ES5,因此除非您需要考虑 ES5 之前的(旧 IE)浏览器,否则您根本不会在意。