【问题标题】:Object.defineProperty vs vanilla propertyObject.defineProperty 与普通属性
【发布时间】:2015-04-25 05:10:50
【问题描述】:

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

foo.bar = 'baz';

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

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

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

【问题讨论】:

  • 你的问题最后有一个问号,但它不是一个真正的问题。你能改写一下这个问题吗?
  • 当您在不使用defineProperty 的情况下定义属性时,obj.property = 'value' 和defineProperty 以及所有具有真值的描述符对象都是相同的。但是,当您更改描述符对象属性(如可配置、可枚举或可写)时,两者的声明都会有所不同。
  • 在绝大多数情况下,它们的行为方式完全相同。但是,如果原型具有不同的属性描述符,则会出现边缘情况:Creating new objects from frozen parent objects
  • 谢谢大家,先生们,这就是我想知道的。

标签: javascript defineproperty


【解决方案1】:

是的,它们的行为相同

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

但是,如果这两个都没有给出,那么两者确实会产生稍微不同的结果。

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

考虑基本使用场景

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

我们能否在 ES6 之前的应用程序中回归原版

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

【讨论】:

  • 另一个行为相同的要求是假设 Object 是全局的(没有被遮蔽)并且全局的 Object 和它的 defineProperty 属性都没有被修改。
  • @Oriol:是的,当然,我希望Object.defineProperty 是内在方法
  • 谢谢,Bergi,很全面
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 2013-03-11
  • 2019-11-14
  • 2013-09-05
  • 2016-09-12
  • 2016-01-10
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多