为什么Object.defineProperty(Object.prototype,“ propname”,{..,value:fn}将fn提升为全局变量?

时间:2019-02-11 23:46:10

标签: javascript object prototype global

您好,最近我绊倒了这个案子,我不知道发生了什么事:

在自调用的匿名函数中,我将对象原型扩展为:

(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原型?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

有人可以解释为什么吗?

因为Object.prototypewindow的原型链中。

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中添加内容。