6

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

foo.bar = 'baz';

Object.defineProperty(foo, 'bar', {
  value: 'baz',
  configurable: true,
  enumerable: true,
  writable: true
});

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

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

4

1 回答 1

4

是的,它们的行为相同

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

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

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

考虑基本使用场景

如果“基本用法”是指不使用花哨的属性属性,那么是的,它们是等价的。然而你应该只使用简单的分配,因为它们更容易阅读并且执行起来更快。

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

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

于 2015-04-25T10:35:59.567 回答