gpt4 book ai didi

javascript - 为什么 Object.defineProperty(Object.prototype, "propname", {.., value : fn} promotes fn to be a global variable?

转载 作者:行者123 更新时间:2023-11-30 14:10:03 25 4
gpt4 key购买 nike

嗨,我最近偶然发现了这个案例,但我不知道发生了什么:

在自调用的匿名函数中,我将对象原型(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);

问题是“值”函数无论如何都会在 Firefox 中自动提升为全局函数。

谁能解释一下为什么?是否可以在不使用全局范围的情况下扩展对象原型(prototype)?

谢谢!

最佳答案

Can anybody explain why?

因为Object.prototypewindow的原型(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", {.., value : fn} promotes fn to be a global variable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54640804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com