а, не думал, что там про это, тогда вопрос исчерпан ^^'
|
Запилил метод .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 ); |
Цитата:
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, ну, лучше уж только перечисляться, чем еще и что-то возвращать
как тебе такой вариант? var B= Class(function( proto ){ proto.define( 'foo', function( ){ return 1 } ) proto.override( 'bar', function( return 2 } ) }) define - создаёт свойство, но бросает исключение, если такое уже есть override - перегружает свойство предка, но бросает исключение, если такого нет ну и расширять тут можно: defineGetter, overrideGetter defineSetter, overrideSetter и так далее |
Цитата:
MainClass = Class({ define: function() {/* ... */}, override: function() {/* ... */} /* ... */ }); A = Class({ 'extends': MainClass /* ... */ }); То же самое касается и этого: Цитата:
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; }}); } } }) |
не, ты не понял, у меня эти методы расширяют прототип, а не экземпляр
а пример, не о том, вот правильный: 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 } ) }) |
Цитата:
|
вот это:
proto.override( 'foo', function( base, 1 ){ return base() + 1 } ) перегруженный метод передаётся в качестве первого параметра |
Цитата:
|
Часовой пояс GMT +3, время: 20:56. |