我正在一个JavaScript项目上,只是想知道为什么对象实例不继承defineProperty()和其他方法,而不必调用超类(superobject?)Object方法。
defineProperty()
Object
我看过了MDN文档,实际上有“非标准”属性方法。
但这些已被弃用。为什么要转向Object方法?
在我看来,类似的东西instance.defineProperty(...)比更好Object.defineProperty(instance, ...)。对于其他一些Object方法,我也会说同样的话。
instance.defineProperty(...)
Object.defineProperty(instance, ...)
这是为了避免发生冲突-通常情况下,对象的问题不具有所需值的属性。 JS中的对象通常用作键-值映射,键可以是任意字符串-例如__defineGetter__,hasOwnProperty或不太特殊的东西。现在,当您想在未知对象上调用此类函数时(就像hasOwnProperty泛型枚举函数中经常使用的那样,可能会传入任何JSON),您永远无法确定自己是否获得了被覆盖的属性(甚至可能不是函数))或所需的原始对象,或者该对象是否完全继承了该属性。为了避免这个问题,您必须使用Object.prototype.hasOwnProperty.call-很难看。
__defineGetter__
hasOwnProperty
Object.prototype.hasOwnProperty.call
因此,命名所有这些功能Object仅是有用的,它是一种更清洁的API,用于将反射方法与对象的应用程序界面分开。这还有助于优化(简化静态分析),并使限制沙箱中对反射API的访问更加容易- 至少这是设计思想。
您可能会很乐意defineProperty在原型中添加一个环,但是只有在使用已知对象时才能安全地使用它。如果您仍然想要它(如您所知何时使用和何时不使用),则可以使用
defineProperty
Object.defineProperty(Object.prototype, "defineProperty", { writable: true, enumberable: false, value: function(prop, descr) { return Object.defineProperty(this, prop, descr); } });