考虑到基本的使用情况,执行以下操作:
foo.bar = 'baz';
并且
Object.defineProperty(foo, 'bar', {
value: 'baz',
configurable: true,
enumerable: true,
writable: true
});
在支持的浏览器中是否能够完全一致地运行?
在ES6之前的应用程序中,我们是否可以因为语法更好而回退到普通的语法,或者混合使用二者而不产生任何副作用?
考虑到基本的使用情况,执行以下操作:
foo.bar = 'baz';
并且
Object.defineProperty(foo, 'bar', {
value: 'baz',
configurable: true,
enumerable: true,
writable: true
});
在支持的浏览器中是否能够完全一致地运行?
在ES6之前的应用程序中,我们是否可以因为语法更好而回退到普通的语法,或者混合使用二者而不产生任何副作用?
是的,当
foo
中没有bar
属性(甚至没有继承的属性),因此将创建一个新属性;或者bar
属性已经存在,且其writable
和configurable
属性都设置为true
然而,如果两种情况都不满足,它们确实会产生稍微不同的结果。
defineProperty
不考虑继承属性及其描述符definePropery
将使用数据描述符覆盖该属性(如果它是自身的、不可配置的属性,则会失败)writable
为false,则赋值将失败,如果为true,则会创建一个新的自身属性,就像defineProperty
总是做的一样writable
为false,则赋值将失败,如果为true,则将设置新值,而defineOwnProperty
将在 configurable
为false时失败,否则将覆盖属性。考虑基本使用的情况
如果“基本使用”是指不使用复杂的属性特性,则它们是等效的。但是,你应该只使用简单的赋值,因为它们更容易阅读和执行速度更快。
在 ES6 之前的应用中可以回退到原有方法吗?
请注意,完整支持 defineProperty
需要 ES5,因此,除非你需要考虑 ES5 之前的浏览器(如旧版 IE),否则你不需要关心这个问题。
Object
是全局对象(未被遮蔽),并且全局Object
及其defineProperty
属性都没有被修改。 - OriolObject.defineProperty
是内置方法。 - Bergi