Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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 - Три возможности
Ответить с цитированием
  #2 (permalink)  
Старый 06.04.2013, 22:22
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от FINoM
а для IE8 возвращать экземпляр XDomainRequest (или просто XDR)
любопытно сколько каждый экзепляр отжирает памяти
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #3 (permalink)  
Старый 06.04.2013, 22:28
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от devote
любопытно сколько каждый экзепляр отжирает памяти
хз, не замерял, но после создания миллиона инстанцов, комп не глючил. Понимаю, что это не объективная оценка, чуть позже проверю (и скорость по сравнению с Хромом, и память).
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #4 (permalink)  
Старый 06.04.2013, 23:21
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сделал небольшую пробу по памяти: перед запуском ИЕ отжирал 30 МБ, на пике съедал 120 МБ, после окончания работы скрипта таск менеджер показал 100МБ. То есть миллион инстанцов отжирают 70—90МБ. Да, опять же, это не глубокое тестирование:
console.log = function() {};
console.time( '1' );
for(var i = 0; i < 1000000; i++) new C;
console.timeEnd('1');

Небольшой замер скорости:
В Хроме 26195.000ms (просто для сравнения)
В ИЕ 10 15683ms
В ИЕ 8 112826ms (всего лишь в ~4 раза медленнее Хрома. Еще раз отмечу, в Хроме используется тривиальное наследование).
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #5 (permalink)  
Старый 07.04.2013, 01:16
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Дальше можно делать всё, что душе угодно, например:
MainClass = Class({
  define: function( key, descriptor ) {
    Object.defineProperty( this, key, descriptor );
  }
});

MyClass = Class({
  'extend': MainClass,
  constructor: function() {
    this.define( 'prop', { get: function() { return 'bla'; }, set: function(v) {alert( v )}} );
  }
});
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #6 (permalink)  
Старый 07.04.2013, 08:46
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от FINoM Посмотреть сообщение
Сделал небольшую пробу по памяти: перед запуском ИЕ отжирал 30 МБ, на пике съедал 120 МБ, после окончания работы скрипта таск менеджер показал 100МБ. То есть миллион инстанцов отжирают 70—90МБ. Да, опять же, это не глубокое тестирование:
console.log = function() {};
console.time( '1' );
for(var i = 0; i < 1000000; i++) new C;
console.timeEnd('1');

Небольшой замер скорости:
В Хроме 26195.000ms (просто для сравнения)
В ИЕ 10 15683ms
В ИЕ 8 112826ms (всего лишь в ~4 раза медленнее Хрома. Еще раз отмечу, в Хроме используется тривиальное наследование).
похоже, что в тесте экземпляры сразу убиваются сборщиком мусора, и в следствие память освобождается. а остаточные 90 мб - это "удалить на потом", т.к. у IE свой тупанутый сборщик мусора, который может очистить память, когда фаза луны соблаговолит - либо через секунду, либо через минуту.

а если собрать экземпляры в массив?
Ответить с цитированием
  #7 (permalink)  
Старый 07.04.2013, 09:36
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

почему нет стирания XDR свойств?
__________________
.ня
Ответить с цитированием
  #8 (permalink)  
Старый 07.04.2013, 11:22
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от tenshi
почему нет стирания XDR свойств?
а ты знаешь способ как это сделать в ИЕ
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #9 (permalink)  
Старый 07.04.2013, 16:35
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

ну так через defineProperty не работает?
__________________
.ня
Ответить с цитированием
  #10 (permalink)  
Старый 07.04.2013, 17:12
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от tenshi
ну так через defineProperty не работает?
ну если бы работало, не было бы фраз на тему того что там есть свойства. И при всем этом FINoM, дал ссылку на предыдущее обсуждение Борьба с Object.defineProperty в IE8 где именно эта проблема и обсуждалась
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Асинхронное программирование - реализация функции для "синхронизации" function Общие вопросы Javascript 8 22.06.2012 13:52
Изменить стиль внутри элемента с определнным id, только для браузера ie8 ansi_str Общие вопросы Javascript 4 03.05.2012 14:11
Реализация игрового поля для игры "Точки" last-art Events/DOM/Window 7 22.04.2012 03:18
Что такое class и для чего они нужны нуб Общие вопросы Javascript 6 29.11.2011 23:31
Свойство display: none для строк в таблице под IE8 vatar Internet Explorer 9 29.09.2011 14:47