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, дата: 4 марта, 2011 - 12:48
#permalink

Запустил, и да удивился. Когда понял что ты написал это от балды не проверив.
Всё работает так-же как и работало, правда теперь с задержкой в 3 секунды.


Автор: Matre, дата: 25 февраля, 2011 - 13:44
#permalink

Автор дебил, в JS нет классов.


Автор: RabiatoR, дата: 4 марта, 2011 - 12:44
#permalink

Matre: зато ты умный, объясни пожалуйста где я сказал что в JS есть классы?


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
2 + 10 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
RabiatoR
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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