gpt4 book ai didi

javascript - 为什么是 Object.defineProperty() 而不是 this.defineProperty() (对于对象)?

转载 作者:数据小太阳 更新时间:2023-10-29 04:08:19 27 4
gpt4 key购买 nike

我正在做一个 JavaScript 项目,只是想知道为什么对象实例不继承 defineProperty() 和其他方法,而不必调用父类(super class)(superobject?) 对象方法。

我看过 MDN docs ,并且实际上存在“非标准”属性方法。

但那些已被弃用。为什么要移动到 Object 方法?

在我看来,instance.defineProperty(...)Object.defineProperty(instance, ...) 更好。我也会对其他一些对象方法说同样的话。

最佳答案

这是为了避免冲突——一般来说,对象不具有您期望的属性的问题。
JS 中的对象通常用作键值映射,键可以是任意字符串 - 例如 __defineGetter__hasOwnProperty 或一些不太特殊的东西。现在,当您想在未知对象上调用这样的函数时——例如 hasOwnProperty 通常用于通用枚举函数,其中可能会传入任何 JSON——您永远无法确定是否获得了被覆盖的属性(这甚至可能不是一个函数)或你想要的原件,或者对象是否继承了该属性。为避免此问题(或 this IE bug ),您必须使用 Object.prototype.hasOwnProperty.call - 这很丑陋。

因此,在 Object 上为所有这些函数命名空间只是有用的,它是一个更清晰的 API,将反射方法与对象的应用程序接口(interface)分开。这也有助于优化(简化静态分析)并更容易限制对沙箱中反射 API 的访问——至少那是 design idea .

您可能会很高兴在原型(prototype)中有一个 defineProperty,但只有在处理已知对象时才能安全地使用它。如果您仍然想要它(因为您知道什么时候使用什么时候不使用),您可以使用

Object.defineProperty(Object.prototype, "defineProperty", {
writable: true,
enumberable: false,
value: function(prop, descr) {
return Object.defineProperty(this, prop, descr);
}
});

关于javascript - 为什么是 Object.defineProperty() 而不是 this.defineProperty() (对于对象)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239317/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com