07.04.2013, 20:46
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
а, не думал, что там про это, тогда вопрос исчерпан ^^'
__________________
.ня
|
|
08.04.2013, 06:40
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Запилил метод .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 );
|
|
08.04.2013, 06:52
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от 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 мегабайт для осла не так уж и много
|
|
08.04.2013, 06:53
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от tenshi
|
почему нет стирания XDR свойств?
|
На них можно повесить геттер и вернуть undefined, но они всё равно будут перечисляться.
|
|
08.04.2013, 10:10
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
FINoM, ну, лучше уж только перечисляться, чем еще и что-то возвращать
как тебе такой вариант?
var B= Class(function( proto ){
proto.define( 'foo', function( ){ return 1 } )
proto.override( 'bar', function( return 2 } )
})
define - создаёт свойство, но бросает исключение, если такое уже есть
override - перегружает свойство предка, но бросает исключение, если такого нет
ну и расширять тут можно:
defineGetter, overrideGetter
defineSetter, overrideSetter
и так далее
__________________
.ня
|
|
08.04.2013, 16:09
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от 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; }});
}
}
})
|
|
08.04.2013, 17:19
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
не, ты не понял, у меня эти методы расширяют прототип, а не экземпляр
а пример, не о том, вот правильный:
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
} )
})
__________________
.ня
|
|
09.04.2013, 22:50
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от tenshi
|
не, ты не понял, у меня эти методы расширяют прототип, а не экземпляр
|
Прототип не наследуется, а копируется в XDR. Хотя я всё равно не очень понял, что ты хочешь этим самым получить.
|
|
10.04.2013, 12:12
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
вот это:
proto.override( 'foo', function( base, 1 ){
return base() + 1
} )
перегруженный метод передаётся в качестве первого параметра
__________________
.ня
|
|
11.04.2013, 01:32
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от tenshi
|
перегруженный метод передаётся в качестве первого параметра
|
Ты имеешь в виду вариант, как сделать parent?
|
|
|
|