JavaScript NewClass v2.0
Функция NewClass теперь имеет следующий вид:
function NewClass( className, constructor, private, public );
В новой версии NewClass появилась возможность определять контроль доступа к данным ( public, private )
Также предусмотрена возможность создания двух методов public и private с одинаковыми именами.
- className - Имя создаваемого класса.
- constructor - Процедура конструктор класса.
- private - Приватная секция данных.
- public - Паблик секция данных.
function call_function( functionName, args, parent ){
var func = typeof( functionName ) === 'function' ? functionName : this.window[functionName];
if( typeof func !== 'function' ){
throw new Error( "call_function: invalid functionName" );
}
return func.apply( parent || func, args );
}
var MakeClass = function(){
return function( args ){
if( this instanceof arguments.callee ){
if( typeof this.__construct == "function" ){
this.__flag = true;
this.__construct.apply( this, args );
this.__flag = false;
}
}else return new arguments.callee( arguments );
};
}
var NewClass = function( className, constructor, private, public ){
var retn = MakeClass();
retn.prototype.__class = className;
retn.prototype.__construct = constructor;
retn.prototype.__private = [];
retn.prototype.__public = [];
retn.prototype.__flag = false;
retn.prototype.__execute = function( func, args ){
if( this.flag ){
if( typeof( this.__private[func] ) === 'function' ) call_function( this.__private[func], args, this );
}else{
if( typeof( this.__public[func] ) === 'function' ){
this.flag = true;
call_function( this.__public[func], args, this );
this.flag = false;
}else if( typeof( this.__private[func] ) === 'function' ){
throw new Error( this.__class + ": try to call \"" + func + "\" private method." );
}
}
}
retn.prototype.__append = function( key ){
retn.prototype[key] = function (){ retn.prototype.__execute( key, arguments ); };
}
for( var key in private ){
retn.prototype.__private[key] = private[key];
retn.prototype.__append( key );
}
for( var key in public ){
retn.prototype.__public[key] = public[key];
retn.prototype.__append( key );
}
window[className] = retn;
return true;
}
- .__class - Имя нашего класса.
- .__construct - функция конструктор класса.
- .__private - список приватных методов/переменных.
- .__public - список публичных методов/переменных.
- .__flag - флаг потока выполнения ( 0 = вне класса, 1 = в классе ).
Пример создания класса и тест его работоспособности:
NewClass( "MyClass", function(){
alert( "MyClass created!" );
},{
palert:function( txt ){
alert( "private palert( " + txt + " );" );
},
testalert:function( txt ){
alert( "private test alert( " + txt + " );" );
}
},{
palert:function( txt ){
this.testalert( txt );
this.palert( txt );
alert( "public palert( " + txt + " );" );
}
});
var _test = MyClass();
_test.palert( "palert called." );
_test.testalert( "testalert called." );
Результат выполнения:
- alert: "MyClass created!"
- alert: "private test alert( palert called. );"
- alert: "private palert( palert called. );"
- alert: "public palert( palert called. );"
- exception: MyClass: try to call "testalert" private method rabiator.html:10242
Тест показал что всё работает как надо
|
Ну-ну. А теперь попробуйте это с setTimeout/setInterval запустить. Будете удивлены. =)