Показать сообщение отдельно
Старый 30.06.2008, 22:14
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 384  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Вот, на мой взгляд более приемлимий вариант приватного метода. Но все же у него есть 2 недостатка:
- в конструкторе его нельзя вызвать как this.privateMethod();
- из-за того, что вотчить _global невозможно, нельзя запретить переписать весь класс вместе с методом.
Код:
function TClass () {
	this.protectPrivate = function(prop, nVal, oVal) {
		throw new Error ("Method is private!");
	}
	this.privateMethod = function() {
		var flag = true;
		for (var i in this) {
			if (arguments.caller == this[i]) flag = false;
		}
		trace(flag);
		TClass.prototype.watch("privateMethod", this.protectPrivate);
		this.watch("privateMethod", this.protectPrivate);
		if (flag) throw new Error ("Method is private!");
		trace ("private method accessed");
	}
	this.publicMethod = function() {
		this.privateMethod();
	}
	this.toString = function() {
		return "[TClass]";
	}
	privateMethod();
}
var t = new TClass();
t.publicMethod();
/*t.privateMethod(); // can not access uncomment to see it working
TClass.prototype.privateMethod = function() {
	trace("private method overrided"); // can not reassign
}
t.privateMethod = function() { // can not reassign in instances
	trace("instances behavior changed");
}*/
__________________
Hell is the possibility of sanity