Object.defineProperty 的主要用例是什么?

What are the main use cases of Object.defineProperty?

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

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

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

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

[[Enumerable]]

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

[[Writable]], [[Configurable]]

就启用新的编程风格而言,这些并不是真正的 "useful",但它们是健全的功能,可让您创建不会被意外覆盖或删除的只读属性。是的,这对图书馆来说很棒。

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