Как стать автором
Обновить

Комментарии 9

Еще один финт ушами для тех, кто определяет свойства прототипа только однажды, после определения функции-конструктора:
// запускается в консоли
Object.defineProperty( Object.prototype, 'awesomeprototype', {
	set: function( object ) {
		for( var prop in object ) {
			Object.defineProperty( this.prototype, prop, {
				value: object[ prop ],
				enumerable: false
			});
		}
	}
});

var X = function() {}
X.awesomeprototype = {
	method: function() { alert( 'ok' ) }
};

var x = new X

x.method()
Стоит отметить что в литералах объектов свойства можно задавать через геттер и сеттер:
var o = {
    __someProperty : 42,
    get someProperty() { return this.__someProperty; },
    set someProperty(v) { this.__someProperty = v; }
};

o.someProperty; // 42
o.someProperty = 56;
o.someProperty; // 56


Ну это так, к слову :)
Аналогично.
поддержка старых браузеров (в том числе и IE8) в проекте, который я сейчас реализую, не требуется (завидуйте).

Сначала посмеялась над фразой, а потом заплакала…
Ну зачем так близко к сердцу-то?
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Кстати также давно действует SugarJS: если в браузере есть defineProperty, то добавляет методы не-enumerable, если же нет — то как обычно.

А считается, что расширять прототипы нельзя не из-за того, что новые методы enumerable (точнее, не только), а из-за принципов инкапсуляции, которые говорят, что системные объекты должны быть неприкосновенны.
Честно говоря, не вижу причин следовать вакуумным принципам инкапсуляции.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории