Комментарии 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
Ну это так, к слову :)
Завидую =)
НЛО прилетело и опубликовало эту надпись здесь
Кстати также давно действует SugarJS: если в браузере есть defineProperty, то добавляет методы не-enumerable, если же нет — то как обычно.
А считается, что расширять прототипы нельзя не из-за того, что новые методы enumerable (точнее, не только), а из-за принципов инкапсуляции, которые говорят, что системные объекты должны быть неприкосновенны.
А считается, что расширять прототипы нельзя не из-за того, что новые методы enumerable (точнее, не только), а из-за принципов инкапсуляции, которые говорят, что системные объекты должны быть неприкосновенны.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Object.defineProperty или как сделать код капельку лучше