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 属性 的 writableconfigurable 属性设置为 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)浏览器,否则您根本不会在意。