Показать сообщение отдельно
  #1 (permalink)  
Старый 06.04.2013, 21:40
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

XDR Class — реализация классов с аксессорами для IE8
Всем привет. Решил показать очередную имплементацию классов для 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 ) немного надоел).
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием