Почему Object.defineProperty (Object.prototype, "propname", {.., value: fn} продвигает fn как глобальную переменную? - PullRequest
0 голосов
/ 12 февраля 2019

Привет, недавно я наткнулся на этот случай, и я понятия не имею, что происходит:

Внутри собственной вызываемой анонимной функции я расширил прототип объекта как:

(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 голосов
/ 12 февраля 2019

Кто-нибудь может объяснить, почему?

Поскольку Object.prototype находится в цепочке прототипов window.

console.log(window instanceof Object);

Поэтому каждое свойство в Object.prototype доступно как «глобальная переменная», например,

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

Это не , специфичный для Firefox, кстати.

и если возможно расширить прототип Object без использованияглобальный охват?

Нет.Это побочный эффект от того, как window и цепочка прототипов работают.

Поскольку Object.prototype является частью почти каждой цепочки прототипов, вам, как правило, следует избегать ее расширения нестандартными методами.

В частности, относительно values: существует Object.values, который работает аналогично и является стандартным методом.Предпочитаю использовать / polyfill этот вместо добавления вещей к Object.prototype.

...