您好,最近我绊倒了这个案子,我不知道发生了什么事:
在自调用的匿名函数中,我将对象原型扩展为:
(function () {
Object.defineProperty(Object.prototype, "values", {
configurable: false,
enumerable: false,
writable: false,
value: function () {
var values = [];
for (var k in this){
values.push(this[k]);
}
return values;
}
});
})();
console.log(window.values);
问题是无论如何,“值”功能都会在Firefox内部自动提升为全局值。
有人可以解释为什么吗?是否可以在不使用全局范围的情况下扩展Object原型?
谢谢!
答案 0 :(得分:2)
有人可以解释为什么吗?
因为Object.prototype
在window
的原型链中。
console.log(window instanceof Object);
因此Object.prototype
上的每个属性都可以用作“全局变量”,例如
console.log(window.toString === Object.prototype.toString);
这不是特定于Firefox btw的。
是否可以在不使用全局范围的情况下扩展Object原型?
不。这是window
和原型链如何工作的副作用。
由于Object.prototype
几乎是每个原型链的一部分,因此通常应避免使用非标准方法对其进行扩展。
特别针对values
:有Object.values
,其工作原理类似,是一种标准方法。宁愿使用/填充此内容,也不要在Object.prototype
中添加内容。