Object.defineProperty 与 vanilla 属性

Est*_*ask 6 javascript defineproperty

考虑到基本的使用场景,做

foo.bar = 'baz';
Run Code Online (Sandbox Code Playgroud)

Object.defineProperty(foo, 'bar', {
  value: 'baz',
  configurable: true,
  enumerable: true,
  writable: true
});
Run Code Online (Sandbox Code Playgroud)

在支持的浏览器中表现完全相同?

我们是否可以仅仅因为有利的语法而在 ES6 之前的应用程序中回退到 vanilla,或者将它们混合在一起而没有任何副作用?

Ber*_*rgi 4

是的,当

  • 没有bar属性foo(甚至没有继承的属性),因此创建一个新的属性,或者
  • 有一个bar属性的writableconfigurable属性设置为true

然而,如果两者都没有给出,则两者确实会产生略有不同的结果。

  • defineProperty不考虑继承的属性及其描述符
  • 如果现有的(可能是继承的)属性是一个访问器,则赋值将尝试调用 setter(如果不存在则失败),同时definePropery将使用数据描述符覆盖该属性(如果它是一个自己的不可配置的属性,则分配将失败) )
  • writable如果现有的继承属性是数据属性,则如果为 false,则赋值将失败,如果为 true,则创建一个新的自有属性,就像defineProperty总是那样
  • 如果现有自有属性是数据属性,则如果writable为 false,则赋值将失败,如果为 true,则设置新值;如果为 false,defineOwnProperty则赋值将失败configurable,否则将覆盖属性。

考虑基本使用场景

如果“基本用法”意味着不使用花哨的属性,那么是的,它们是等效的。然而,您应该只使用简单的作业,因为它们更易于阅读且执行速度更快。

我们可以在 ES6 之前的应用程序中回退到普通版本吗

请注意,ES5 附带完全支持defineProperty,因此除非您需要考虑 ES5 之前的(旧 IE)浏览器,否则您根本不会关心。