一尘不染

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

javascript

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

我看过了MDN文档,实际上有“非标准”属性方法。

但这些已被弃用。为什么要转向Object方法?

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


阅读 354

收藏
2020-05-01

共1个答案

一尘不染

这是为了避免发生冲突-通常情况下,对象的问题不具有所需值的属性。
JS中的对象通常用作键-值映射,键可以是任意字符串-例如__defineGetter__hasOwnProperty或不太特殊的东西。现在,当您想在未知对象上调用此类函数时(就像hasOwnProperty泛型枚举函数中经常使用的那样,可能会传入任何JSON),您永远无法确定自己是否获得了被覆盖的属性(甚至可能不是函数))或所需的原始对象,或者该对象是否完全继承了该属性。为了避免这个问题,您必须使用Object.prototype.hasOwnProperty.call-很难看。

因此,命名所有这些功能Object仅是有用的,它是一种更清洁的API,用于将反射方法与对象的应用程序界面分开。这还有助于优化(简化静态分析),并使限制沙箱中对反射API的访问更加容易-
至少这是设计思想

您可能会很乐意defineProperty在原型中添加一个环,但是只有在使用已知对象时才能安全地使用它。如果您仍然想要它(如您所知何时使用和何时不使用),则可以使用

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