嗨,最近我偶然发现了这个案例,我不知道发生了什么:
在自调用的匿名函数中,我将对象原型(prototype)扩展为:
(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);
问题在于,无论如何,“values”函数都会在 Firefox 中自动提升为全局函数。
谁能解释一下为什么吗?是否可以在不使用全局作用域的情况下扩展对象原型(prototype)?
谢谢!
最佳答案
Can anybody explain why?
因为Object.prototype
在window
的原型(prototype)链中。
console.log(window instanceof Object);
因此,Object.prototype
上的每个属性都可用作“全局变量”,例如
console.log(window.toString === Object.prototype.toString);
顺便说一句,这不是特定于 Firefox 的。
and if its posible to extend the Object prototype without using the global scope?
没有。这是 window
和原型(prototype)链工作方式的副作用。
因为 Object.prototype
是几乎每个原型(prototype)链的一部分,所以通常应该避免使用非标准方法扩展它。
特别是关于值
:有Object.values
,其工作原理类似,是一种标准方法。更喜欢使用/polyfill 这个,而不是向 Object.prototype
添加东西。
关于javascript - 为什么 Object.defineProperty(Object.prototype, "propname", {.., 值 : fn} promotes fn to be a global variable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54640804/