这是为了避免发生冲突-通常情况下,对象的问题不具有所需值的属性。 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);
}
});