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

标签 javascript object prototype global

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

在自调用的匿名函数中,我将对象原型(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.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", {.., 值 : fn} promotes fn to be a global variable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54640804/

相关文章:

javascript - ES6 Javascript : Calling static methods from classes with arrow functions

javascript - 如何使用 jQuery 或 JS 检查事件处理程序是否存在?

javascript - 查询对象数组不包含等于字符串值的属性

java - 字段 vs 字段和新对象

javascript - 在字符串中的完整大写标题后添加换行符

javascript - 替换内置函数的原型(prototype)是否非法?

javascript - 据说所有 Javascript 对象都有一个原型(prototype)属性,但如果 foo 是一个函数,我只看到 foo.prototype ?

javascript - 关于带参数传递函数的函数式编程问题

java - 为什么对象分配引用内存位置,而基本类型则不然?

jquery - Node.js 上的 Javascript 框架