【问题标题】:What are the main use cases of Object.defineProperty?Object.defineProperty 的主要用例有哪些?
【发布时间】:2015-04-04 05:59:41
【问题描述】:

我在 Javascript 教科书中阅读了有关 数据属性 的内容,并想象将 Object.defineProperty 仅与 访问器属性 结合使用。

Object.defineProperty 设置属性的其他主要用例有哪些:[[Enumerable]][[Writable]][[Configurable]]?它在框架中使用吗?出于什么原因?是否在客户端应用程序中使用?

【问题讨论】:

  • mdn 通常非常有见地,并且会与用例交谈。
  • 主要用例是定义一个属性。

标签: javascript object ecmascript-5


【解决方案1】:

Object.defineProperty 通常可用于使用相关方法 Object.getOwnPropertyNames()Object.getOwnPropertyDescriptor() 将属性描述符从一个对象复制到另一个对象,例如将事物合并到原型中时。

正如您已经提到的,它们可用于 getter 和 setter。对象字面量语法仅在创建新对象时有效。要在现有对象(例如原型)中创建新的 getter/setter,您必须使用 Object.defineProperty(),或复制描述符,如上所述。

[[可枚举]]

有助于避免通过Object.keys() 进行枚举、for ... in 循环、向数组子类添加属性等。 这在向内置原型添加 polyfill 时非常重要,尤其是 Object.prototype,因为您不希望添加的方法突然出现在循环中,因为它可能会破坏其他不执行 .hasOwnProperty() 检查的代码。

[[可写]]、[[可配置]]

在启用新的编程风格的意义上,这些并不是真正的“有用”,但它们是健全的功能,允许您创建不会被意外覆盖或删除的只读属性。所以,是的,这对图书馆来说很棒。

Object.freeze() / .seal() / .preventExtensions() 将这种保护进一步扩展到您可以通过保护内置对象的原型来充分保护对象以创建一些安全的 javascript eval 沙箱。

【讨论】:

  • “getter 和 setter 在 ES5 中没有专用语法”是什么意思?
  • freeze/seal/preventExtensions 也是very much ES5
  • 啊,对,我在想方法速记声明。我会编辑那个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2011-01-12
相关资源
最近更新 更多