Всем привет. Решил показать очередную имплементацию классов для JS, но с поддержкой геттеров и сеттеров с помощью Object.defineProperty, работающую в IE8. Идея очень проста: для нормальных браузеров использовать тривиальное наследование, которое можно найти в любом учебнике по JS, а для IE8 возвращать экземпляр XDomainRequest (или просто XDR), расшрияя нужными свойствами (то есть протоип менять не рекомендуется, список свойств должен быть статичным, как в работе
devote).
Для тех, кто не в курсе, IE8 поддерживает Object.defineProperty для DOM объектов, XDR, в этом случае, наиболее привлекателен, так как его экземпляр имеет всего 7 свойств + 3 у прототипа.
Object.defineProperty для IE8 поддерживается кое-как. Более подробно можно прочесть в этой теме:
Борьба с Object.defineProperty в IE8
Поэтому я настойчиво рекомендую использовать в качестве элементов дескриптора только get и set.
Документации никакой нет, но появится после успешного завершения работы над фреймворком (превью которого я покажу чуть позже). Код выложил в репозиторий:
https://github.com/finom/xdr-class/b...r/xdr-class.js (для того, чтоб проверить, просто выкачайте репозиторий и запустите index.html, сюда и на jsFiddle вставить код не могу из-за политик безопасности в IE)
Функция требует underscore (хотя его можно легко убрать).
A = Class({
a1: 'Aa1',
a2: 'Aa2',
aMethod1: function(arg) {
Object.defineProperty( this, 'x', {
get: function() {
return 'X Property'
},
set: function( v ) {
console.log( 'Message from "x" setter, value is: ', v );
}
});
console.log( 'A.Method1 call, arg is: ', arg )
}
});
B = Class({
'extends': A, // кавычки обязательны (для подсветки и чтоб не вызвать ошибки в IE), но 'extends' можно заменить на extend без кавычек
b1: 'Bb1',
b2: 'Bb2',
a2: 'Ba2',
constructor: function() {
console.log( 'B.constructor call' );
}
});
C = Class({
'extends': B,
c1: 'Cc1',
b1: 'Cb1',
constructor: function() {
this.aMethod1( 'BLAH' );
this.x = 'New X Value';
B.call( this, arguments );
console.log( 'Properties: ', this.c1, this.b1, this.b2, this.a1, this.a2 );
},
aMethod1: function() {
console.log( 'C.method call' );
B.prototype.aMethod1.apply( this, arguments );
}
});
new C;
Из todo: добавить метод .instanceOf и что-то придумать с вызовом родительских методов (B.prototype.aMethod1.call( this ) немного надоел).