Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #41 (permalink)  
Старый 16.02.2012, 02:55
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

(function() {
 alert('щас создадим сущность  с публичным методом w и вызовем его')
	// собрать self объект
	function getSelf(obj) {
		var self = Object.create(Object.getPrototypeOf(obj).__private__);

		// добавить все методы self методов self'у
		for ( var i in selfMethods) {
			self[i] = selfMethods[i].bind(obj);
		}
		return self
	};

	// установить свойство
	function setProp(obj, propType, name, value) {
		Object.getPrototypeOf(obj)['__' + propType + '__'][name] = (typeof value === 'function')
				? value.bind(getSelf(obj))
				: value;
		return true
	};

	// получить свойство
	function getProp(obj, propType, name) {
		return Object.getPrototypeOf(obj)['__' + propType + '__'][name]
	};

	// методы объекта self
	selfMethods = {
		// добавить приватные
		private : function(name, value) {
			if (arguments.length > 1) {
				return setProp(this, 'private', name, value);
			} else if (typeof name == 'string') {
				return getProp(this, 'private', name);
			}
			for ( var i in name) {
				setProp(this, 'private', i, name[i]);
			}
			return true
		},
		// добавить публичные
		public : function(name, value) {
			if (arguments.length > 1) {
				return setProp(this, 'public', name, value);
			} else if (typeof name == 'string') {
				return getProp(this, 'public', name);
			}
			for ( var i in name) {
				setProp(this, 'public', i, name[i]);
			}
			return true
		}
	};

	window['Class'] = function(classDescription) {

		return function() {
			// создаем наборы свойств сущности
			var prop = {};
			prop.__public__ = Object.create(prop);
			prop.__static__ = Object.create(prop.__public__);
			prop.__private__ = Object.create(prop.__static__);

			// создаем инициализатор
			var init = {
				// добавить приватные
				private : function(name, value) {
					if (arguments.length > 1) {
						return setProp(prop.__public__, 'private', name, value);
					} else if (typeof name == 'string') {
						return getProp(prop.__public__, 'private', name);
					} else {
						for ( var i in name) {
							return setProp(prop.__public__, 'private', i,
									name[i]);
						}
					}
				},
				// добавить публичные
				public : function(name, value) {
					if (arguments.length > 1) {
						return setProp(prop.__public__, 'public', name, value);
					} else if (typeof name == 'string') {
						return getProp(prop.__public__, 'public', name);
					} else {
						for ( var i in name) {
							return setProp(prop.__public__, 'public', i,
									name[i]);
						}
					}
				}
			}

			// инициализируем свойства
			classDescription.apply(init)
			// возвращаем публичный набор свойств
			return prop.__public__
		}

	}
})()























var Cat = Class(function() {
	this.private({
		'name' : 'приватное имя',
		'go' : function() {
			alert('go')
		}
	});
	this.public(
					'w',
					function() {
						alert('Привет, я публичный метод w, сейчас я перезапишу себя и вызову публичный метод w этой сущности, то есть нового себя)');
						this
								.public({
									'w' : function() {
										alert('привет, я новый публичный метод w, вызван из старого метода w. Кстати еще старый w создал приватную переменную bar и засунул в неё число 200, хоть и не сказал вам, щас я посмотрю что там')
										alert(this.bar);
										alert('я только что алертнул this.bar)! шикарно она автоматически нашлась в моем контексте, хотя и приватная! ну так и должно быть! ура! работает блять! я завершаюсь...')
									}
								});
						this.private('bar', 200);
						alert('перезаписал, вызываю, и передаю управление ему, до встречи)!')
						this.w()
						alert('привет я старая w, только что отработала новая w. Публичную ссылку на меня уже перезаписали так что меня вы больше не увидете, новая w отработала как надо и я тоже завершаюсь, всем покеда! Скоро мой хозяин запилит статик и протект свойства')
					});

})

var q = Cat()
q.w()

Последний раз редактировалось Mахmахmахimus, 16.02.2012 в 06:10.
Ответить с цитированием
  #42 (permalink)  
Старый 16.02.2012, 02:59
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

ПОКА свойства можно добавлять только так
this.private('name', value)
this.private({'name': value, 'bar': function(){}})

получать так
this.private('name')

либо так
this.name
поиск будет идти так private => static => public


как по мне так такой интерфейс не очень удобный я бы предпочел просто
this.private.name = "value"

по этому сделаю версию с проксями.

Последний раз редактировалось Mахmахmахimus, 16.02.2012 в 03:12.
Ответить с цитированием
  #43 (permalink)  
Старый 16.02.2012, 03:00
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

http://xn----9sbbncvmaexvsfv6a.jpg.to/
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #44 (permalink)  
Старый 16.02.2012, 03:01
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Я к тому, что без наследования этот код бессмысленнен. Или я что-то недоглядел?
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #45 (permalink)  
Старый 16.02.2012, 03:06
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

Сообщение от FINoM
Или я что-то недоглядел?
Я вроде писал что я сделаю и наследование и.т.п. Или не писал? мне тоже кажется приватные можно было бы не плохо себе делать и через замыкания)
Можешь сказать пару слов, не давая ссылки на литературу. Мне нужен живой ответ. Так как он конкретнее и короче.

Классы могут наследовать от классов, так же классы могут наследовать от СУЩНОСТЕЙ, так?)


п.с. ну еще конеш присваивать можно вот так
this.__private__.d = 4;
alert(this.d)
доступны
this.__private__
this.__public__
this.__static__
как обычно

Последний раз редактировалось Mахmахmахimus, 16.02.2012 в 04:14.
Ответить с цитированием
  #46 (permalink)  
Старый 16.02.2012, 03:59
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Хз о чем ты. Я в традиционном ООП разбираюсь не больше твоего.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #47 (permalink)  
Старый 16.02.2012, 08:38
Аватар для poorking
prodigy
Отправить личное сообщение для poorking Посмотреть профиль Найти все сообщения от poorking
 
Регистрация: 01.11.2010
Сообщений: 503

Сообщение от Mахmахmахimus
поиск будет идти так private => static => public
Я не понимаю причем тут static, он не относится к разграничениям прав доступа, static - это фактически свойство класса, а не экземпляра. То есть MyClass.staticProperty. Но конечно к ним можно обращаться и из контекста экземпляра, то так не делают чтобы не путаться. И они тоже наследуются. Поле может быть одновременно, например
public static property
или
private static property
или
protected static property

А еще бывают abstract поля, abstract классы, интерфейсы. Ждем от тебя реализации полноценных классов на JS
__________________
readOnly

Последний раз редактировалось poorking, 16.02.2012 в 08:42.
Ответить с цитированием
  #48 (permalink)  
Старый 16.02.2012, 13:37
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

poorking,
Спасибо ОГРОМНОЕ!

Самое сложное это то что я голову ломаю как не использовать __proto__, пока получается.

Такое описание класса устроит?

var Cat = Class(function() {
	this.public({
		w : function() {
			alert(this.all)
		}
	})

	this.public.static({
		all : "общее публичное свойство"
	})

	this.private({
		'bar' : 300
	})

	this.private.static({
		'baz' : "общее приватное свойство"
	})
})

Последний раз редактировалось Mахmахmахimus, 16.02.2012 в 13:54.
Ответить с цитированием
  #49 (permalink)  
Старый 16.02.2012, 14:22
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

Слушайте, я не знаю как сделать чтобы паблик свойства делились на статические и обычные, при том чтобы они находились НА ПРЯМУЮ в обьекте. Это обязательно? А то я бы засунул в цепочку прототипов. Или так нельзя?
Ответить с цитированием
  #50 (permalink)  
Старый 16.02.2012, 14:24
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

poorking,
Раз к статик свойствам не обращаются на прямую из контекста экземпляра, то когда к ним обращаются?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Javascript - классы, они есть или их нету в Javascript? Golovastik Javascript под браузер 39 15.02.2013 10:38
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23
javascript вставки в vrml сцены. Передать событие из броузера Proletariy Javascript под браузер 0 10.05.2011 12:26
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34