Object.defineProperty vs vanilla属性

时间:2015-04-25 05:10:50

标签: javascript defineproperty

考虑使用的基本情况,请执行

foo.bar = 'baz';

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

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

我们可以在ES6之前的应用程序中回归到vanilla,只是因为它们有良好的语法或混合它们而没有任何副作用吗?

1 个答案:

答案 0 :(得分:3)

是的,它们在

时的行为相同
  • bar中没有foo属性(甚至不是继承的属性),因此创建了新属性,或
  • 有一个bar属性,writableconfigurable属性设置为true

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

  • defineProperty不考虑继承的属性及其描述符
  • 如果现有(可能是继承的)属性是访问者,则赋值将尝试调用setter(如果不存在则会失败),而definePropery将使用数据描述符覆盖该属性(或者如果它失败)是一个自己的,不可配置的))
  • 如果现有的继承属性是数据属性,则如果writable为false,则赋值将失败;如果为true,则创建新的属性,如defineProperty始终为
  • 如果现有的属性是数据属性,则writable为false时分配将失败,如果为true,则分配新值;如果defineOwnProperty为false,则configurable将失败并以其他方式覆盖属性。
  

考虑使用的基本情况

如果通过"基本用法"你的意思是没有使用花哨的属性属性,那么是的,它们是等价的。然而,您应该只使用简单的分配,因为它们更容易阅读并且执行起来更快。

  

我们能否在ES6之前的应用程序中回归到香草

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