Javascript.RU

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." );

Результат выполнения:

  1. alert: "MyClass created!"
  2. alert: "private test alert( palert called. );"
  3. alert: "private palert( palert called. );"
  4. alert: "public palert( palert called. );"
  5. exception: MyClass: try to call "testalert" private method rabiator.html:10242

Тест показал что всё работает как надо

Прикрепленный файлРазмер
NewClass.js.txt2.42 кб
NewClass.min.js.txt1.53 кб
-3

Автор: Гость (не зарегистрирован), дата: 20 февраля, 2011 - 13:17
#permalink

Ну-ну. А теперь попробуйте это с setTimeout/setInterval запустить. Будете удивлены. =)


 
Поиск по сайту
Другие записи этого автора
RabiatoR
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние темы на форуме
Forum