我在Javascript教科书中读到了数据属性,并想象Object.defineProperty
仅与访问者属性结合使用。
Object.defineProperty设置属性的其他主要用例是什么:[[Enumerable]]
,[[Writable]]
,[[Configurable]]
?它是否在框架中使用?出于什么原因?它是否用于客户端应用程序?
答案 0 :(得分:3)
Object.defineProperty
通常可用于使用相关方法Object.getOwnPropertyNames()
和Object.getOwnPropertyDescriptor()
将属性描述符从一个对象复制到另一个对象,例如将事物合并到原型中时。
正如您已经提到的,它们可以用于吸气剂和固定剂。对象文字语法仅在创建新对象时有效。要在现有对象(例如原型)中创建新的getter / setter,您必须使用Object.defineProperty()
,或复制描述符,如上所述。
[[可枚举]]
有助于避免通过Object.keys()
枚举,for ... in循环,向数组子类添加属性等。
将polyfill添加到内置原型时非常重要,尤其是Object.prototype
,因为您不希望添加的方法突然出现在循环中,因为它可能会破坏其他代码而不会执行.hasOwnProperty()
检查。
[[可写]],[[可配置]]
在启用新编程样式的意义上,这些并不是真正“有用”,但它们是健全功能,允许您创建无法被意外覆盖或删除的只读属性。所以是的,这对图书馆来说很棒。
Object.freeze()
/ .seal()
/ .preventExtensions()
进一步扩展此类保护,使您可以通过保护内置原型来充分保护对象,从而创建一些安全的javascript eval沙箱在对象中。