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

3

我曾在Javascript教材中读到关于数据属性的内容,想象使用Object.defineProperty仅与访问器属性一起使用。

除了用于设置属性:[[Enumerable]][[Writable]][[Configurable]]之外,Object.defineProperty还有哪些主要用例?它是否在框架中被使用?出于什么原因?它是否在客户端应用程序中被使用?


2
mdn通常非常有见地,讨论了使用案例。 - Brad Christie
主要用例是定义一个属性。 - user663031
1个回答

4
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沙箱来保护内置对象的原型。


“getters和setters在ES5中没有专用的语法”是什么意思? - Bergi
freeze/seal/preventExtensions 在 ES5 中非常常见。请参考:http://es5.github.io/#x15.2.3.8 - Bergi
啊对,我在想方法的简写声明。我会编辑一下。 - the8472

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接