Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   XDR Class — реализация классов с аксессорами для IE8 (https://javascript.ru/forum/project/37074-xdr-class-%E2%80%94-realizaciya-klassov-s-aksessorami-dlya-ie8.html)

tenshi 07.04.2013 20:46

а, не думал, что там про это, тогда вопрос исчерпан ^^'

FINoM 08.04.2013 06:40

Запилил метод .instsanceOf
a.instanceOf( B );
(думаю, можно не описывать, что он делает).

Сделал небольшую замену для MyClass.prototype.method.apply( this, arguments );

Она не так хорошо выглядит, как у devote (я так понимаю, ты как-то декорировал методы?), зато реализация выглядит сильно проще. Моего ума пока не хватило сделать нормальный, не зацикливающийся parent (this.parent.method()).

A = Class({
   method: function() {}
});

B = Class({
  method: function() {
    B.parent.method( this );
  }
});


Чтобы вызвать метод родительского класса пишем имя текущего класса (указывать в методах название родительского класса — совсем некрасиво, но своего — уже лучше), свойство parent, имя метода, аргументы:
1. this - обязательно
2. arguments или любые аргументы
Можно написать так:
B.parent.method( this, arguments );

а можно и так:
B.parent.method( this, 1, 2, 3, 4, 5 );

FINoM 08.04.2013 06:52

Цитата:

Сообщение от melky
а если собрать экземпляры в массив?

console.log = function() {}; x = {}; console.time( '1' ); for( var i = 0; i < 100000; i++ ) x[ i ] = new C; console.timeEnd( '1' )
Миллион инстанцов сожрали около гига, сто тысяч сожрали, ожидаемо, 100 мегабайт. Не знаю, хорошо это или плохо, но совет очевиден: не создавайте больше 100 тысяч инстанцов, 100 мегабайт для осла не так уж и много :)

FINoM 08.04.2013 06:53

Цитата:

Сообщение от tenshi
почему нет стирания XDR свойств?

На них можно повесить геттер и вернуть undefined, но они всё равно будут перечисляться.

tenshi 08.04.2013 10:10

FINoM, ну, лучше уж только перечисляться, чем еще и что-то возвращать

как тебе такой вариант?

var B= Class(function( proto ){
    proto.define( 'foo', function( ){ return 1 } )
    proto.override( 'bar', function( return 2 } )
})


define - создаёт свойство, но бросает исключение, если такое уже есть
override - перегружает свойство предка, но бросает исключение, если такого нет

ну и расширять тут можно:
defineGetter, overrideGetter
defineSetter, overrideSetter
и так далее

FINoM 08.04.2013 16:09

Цитата:

Сообщение от tenshi
как тебе такой вариант?

Предполагатся, что разработчик сделает всё что желает. В моей хернюшке только самый необходимый минимум. Если программист хочет расширить количество методов, он просто создаёт свой главный класс, от которого наследуются другие:
MainClass = Class({
  define: function() {/* ... */},
  override: function() {/* ... */}
  /* ... */
});

A = Class({
  'extends': MainClass 
   /* ... */
});

То же самое касается и этого:
Цитата:

Сообщение от tenshi
ну, лучше уж только перечисляться, чем еще и что-то возвращать

Навешивание аксессоров занимает, пускай не большое, количество ресурсов. Если разработчик хочет, может сам это сделать. Но если ему это не нужно, то и незачем тратить процессорное время и память (пускай и мизерные количества).
MainClass = Class({
  initMainClass: function() {
    // можно перечислить все семь свойств и вернуть в геттере undefined,
    // а можно и перечислить всего три (которые не null) и вернуть null
    var badProps = [ 'contentType', 'timeout', 'responseText' ];
    for(var i = 0; i < badProps.length; i++ ) {
      Object.defineProperty( this, badProps[ i ], { get: function() { return null; }});
    }
  }
})

tenshi 08.04.2013 17:19

не, ты не понял, у меня эти методы расширяют прототип, а не экземпляр

а пример, не о том, вот правильный:

var A= Class(function( proto ){
    proto.define( 'foo', function( ){ return 1 } )
})
var B= Class(function( proto ){
    proto.mixin( A )
    proto.override( 'foo', function( base, 1 ){
        return base() + 1
    } )
})

FINoM 09.04.2013 22:50

Цитата:

Сообщение от tenshi
не, ты не понял, у меня эти методы расширяют прототип, а не экземпляр

Прототип не наследуется, а копируется в XDR. Хотя я всё равно не очень понял, что ты хочешь этим самым получить.

tenshi 10.04.2013 12:12

вот это:
proto.override( 'foo', function( base, 1 ){
        return base() + 1
    } )

перегруженный метод передаётся в качестве первого параметра

FINoM 11.04.2013 01:32

Цитата:

Сообщение от tenshi
перегруженный метод передаётся в качестве первого параметра

Ты имеешь в виду вариант, как сделать parent?


Часовой пояс GMT +3, время: 20:56.