为什么Object.defineProperty(Object.prototype中,“PROPNAME”,{..,值:FN}促进FN是一个全局变量?

问题描述 投票:1回答:1

你好我最近偶然发现了这种情况下,我不知道怎么回事:

内部自调用匿名函数我已经扩展了对象原型为:

(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全球不管是什么。

任何人都可以解释,为什么?如果有可能,而不使用在全球范围内扩展对象原型?

谢谢!

javascript object prototype global
1个回答
2
投票

任何人都可以解释,为什么?

因为Object.prototypewindow的原型链。

console.log(window instanceof Object);

因此,对Object.prototype每个属性是可作为“全局变量”,如

console.log(window.toString === Object.prototype.toString);

这不是针对Firefox的BTW。

如果有可能,而不使用在全球范围内扩展对象原型?

号那怎么window和原型链工程的副作用。

由于Object.prototype几乎是每个原型链的一部分,你应尽量避免使用非标准的方法扩展它。

特别是关于values:有Object.values,其工作方式类似于和是一个标准的方法。喜欢使用/填充工具这一块,而不是添加的东西Object.prototype的。

© www.soinside.com 2019 - 2024. All rights reserved.