我曾在Javascript教材中读到关于数据属性的内容,想象使用Object.defineProperty
仅与访问器属性一起使用。
除了用于设置属性:[[Enumerable]]
、[[Writable]]
、[[Configurable]]
之外,Object.defineProperty
还有哪些主要用例?它是否在框架中被使用?出于什么原因?它是否在客户端应用程序中被使用?
我曾在Javascript教材中读到关于数据属性的内容,想象使用Object.defineProperty
仅与访问器属性一起使用。
除了用于设置属性:[[Enumerable]]
、[[Writable]]
、[[Configurable]]
之外,Object.defineProperty
还有哪些主要用例?它是否在框架中被使用?出于什么原因?它是否在客户端应用程序中被使用?
Object.defineProperty
一般用于从一个对象复制属性描述符到另一个对象,相关方法有Object.getOwnPropertyNames()
和Object.getOwnPropertyDescriptor()
。例如,在将某些内容合并到原型中时使用此方法。
正如您已经提到的,它们可用于创建getter和setter。对象字面量语法只适用于创建新对象。要在现有对象(例如原型)中创建新的getter / setter,必须使用Object.defineProperty()
或复制描述符,如上所述。
[[Enumerable]]
避免通过Object.keys()
、for...in循环、向数组子类添加属性等方式进行枚举非常有用。
当为内置原型添加填充程序(polyfills)时,这非常重要,特别是Object.prototype
,因为您不希望您添加的方法突然出现在循环中,这可能会破坏其他不执行.hasOwnProperty()
检查的代码。
[[Writable]],[[Configurable]]
这些不是真正“有用”的,因为它们没有启用新的编程风格,但它们是一种健全性功能,可以创建只读属性,防止被意外覆盖或删除。对于库来说非常好用。
Object.freeze()
/ .seal()
/ .preventExtensions()
可以将这种保护进一步扩展到足以创建相当安全的JavaScript eval沙箱来保护内置对象的原型。
freeze
/seal
/preventExtensions
在 ES5 中非常常见。请参考:http://es5.github.io/#x15.2.3.8 - Bergi