Javascript.RU

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

Классы в javascript harmony.
Практически доделал разделение свойств.
Разделение свойств работает так, посмотрите что не так, что норм Если пока норм то начну делать наследование. (То что МЕТА, то недоступно человеку, то что находится в МЕТА то имеет доступ ко всему что есть в мета.)
В паблик сущностей выводятся смешенные паблик статик и паблик не статик свойства. Иметь одинаковые имена паблик статик и паблик не статик не могут. При обьявлении класса, то что будет ниже то перезапишет то что было с одинаковым именем выше.

В Конструкторе есть 2 свойства private и public в них содержатся статические свойства сущностей чтобы можно было изменять их не только через сущностей а еще и через конструктор)



Так же сохраняется прототипная модель которая ни как не конфликтует с типовой)
Классовые свойства перекрывают прототипные с одинаковыми именами. Все как обычно. Прототипные методы правда не имеют доступ к внутренним свойствам сущностей относительно которых они вызываются (к тому что в META) но это ПОКА. Вообще я думаю сделать доступ или не сделать. Допустим я хочу создавать обьекты на основе какого-то прототипа. Я хочу чтобы методы этого обьекта прототипа вызванные относительно сущностей, ИМЕЛИ доступ к нутру этих сущностей. Правильно ли это бы было?
например

Cat.prototype.sayPrivateName = function(){
   alert(this.privateName)
}


вызванное так
cat1.sayPrivateName ()

ИМЕЛО бы доступ к приватным этого cat1
правильно ли это?
Ответить с цитированием
  #2 (permalink)  
Старый 19.02.2012, 02:22
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

log = console.log.bind(console);

(function() {
	// пространства свойств
	var propSpases = ["__private__", "__privateStatic__", "__public__",
			"__publicStatic__"];

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

	// собрать self объект
	function getSelf(obj) {

		var self = Proxy
				.create({
					get : function(proxy, name) {
						switch (name) {
							case 'public' :
								alert('public')
								break;
							case 'private' :
								alert('private')
								break;
							case 'static' :
								alert('static')
								break;
							default :
								for ( var i = 0; i < propSpases.length; i++) {
									if (obj[propSpases[i]].hasOwnProperty(name)) {
										return obj[propSpases[i]][name]
									}
								}
						}
					},
					set : function(proxy, name, value) {
						switch (name) {
							case 'public' :
								alert('public')
								break;
							case 'private' :
								alert('private')
								break;
							case 'static' :
								alert('static')
								break;
							default :
								for ( var i = 0; i < propSpases.length; i++) {
									if (obj[propSpases[i]].hasOwnProperty(name)) {
										return setProp(obj, propSpases[i],
												name, value);
									}
								}
								return false
						}
					}
				})

		return self
	};

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

		// создаем конструктор
		var constructor = function() {

			// создаем персональные наборы свойств сущности
			var prop = {};
			prop.__private__ = {};
			prop.__privateStatic__ = constructor.private;
			prop.__public__ = {};
			prop.__publicStatic__ = constructor.public;

			// создаем инициализатор
			var init = {
				private : function(properts) {
					for ( var i in properts) {
						setProp(prop, '__private__', i, properts[i]);
					}
					return true
				},
				public : function(properts) {
					for ( var i in properts) {
						setProp(prop, '__public__', i, properts[i]);
					}
					return true
				},
				privateStatic : function(properts) {
					for ( var i in properts) {
						setProp(prop, '__privateStatic__', i, properts[i]);
					}
					return true
				},
				publicStatic : function(properts) {
					for ( var i in properts) {
						setProp(prop, '__publicStatic__', i, properts[i]);
					}
					return true
				}

			};

			// инициализируем свойства
			classDescription.apply(init, arguments)

			// возвращаем интерфейс для работы с публичными свойствами
			return Proxy.create({
				get : function(proxy, name) {
					if (prop.__publicStatic__.hasOwnProperty(name)) {
						return prop.__publicStatic__[name]
					}
					if (prop.__public__.hasOwnProperty(name)) {
						return prop.__public__[name]
					}
				},

				set : function(proxy, name, value) {
					if (prop.__public__.hasOwnProperty(name)) {
						prop.__public__[name] = value;
						return true;
					}
					if (prop.__publicStatic__.hasOwnProperty(name)) {
						prop.__publicStatic__[name] = value;
						return true;
					}
					prop.__public__[name] = value;
					return true;
				},

				getOwnPropertyDescriptor : function(name) {
					if (prop.__public__.hasOwnProperty(name)) {
						return Object.getOwnPropertyDescriptor(prop.__public__,
								name)
					}
					if (prop.__publicStatic__.hasOwnProperty(name)) {
						return Object.getOwnPropertyDescriptor(
								prop.__publicStatic__, name)
					}
				},

				getOwnPropertyNames : function() {
					var names = Object.getOwnPropertyNames(prop.__public__)

					return names.concat(Object
							.getOwnPropertyNames(prop.__publicStatic__))
				},
				getPropertyDescriptor : function() {
					alert('getPropertyDescriptor')
				},
				getPropertyNames : function() {
					alert('getPropertyNames')
				},
				defineProperty : function() {
					alert('defineProperty')
				},
				'delete' : function() {
					alert('delete')
				},

				hasOwn : function() {
					alert('hasOwn')
				},
				enumerate : function() {
					alert('enumerate')
				},
				keys : function() {
					alert('keys')
				}

			}, prop)

		}

		// создаем статические наборы свойств сущностей
		constructor.private = {}
		constructor.public = {}

		// возвращаем конструктор
		return constructor
	}
})()








var Cat = Class(function() {
	this.private({
		'name' : 'приватное имя',
		'age' : 200,
		'go' : function() {
			alert('go')
		}
	});
	this.public({
		'w' : function() {
			alert('количество созданных: ' + this.col)
		},
		'pub' : 0
	});
	this.privateStatic({
		'a' : 0
	})
	this.publicStatic({
		'ps' : 'publicStatic'
	})
})





var q = Cat()
var w = Cat()
log(q)
log(w)
Ответить с цитированием
  #3 (permalink)  
Старый 19.02.2012, 02:59
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Mахmахmахimus,
Harmony тут причём?
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #4 (permalink)  
Старый 19.02.2012, 03:12
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

Nekromancer,
Proxy обьекты и метапрогарммирование.
Прокси в роли роутера.
Я бы мог и без прокси сделать, но юзать это бы было ужас как не естественно.
внутри методов
не this.prop , а this('prop') например
не this.age ++ , а this.('age', this('age')+1 )

раньше методы эплуились через aeyrwb. роутера которая внутри них была как this
щас эплаются через прокси обьект который тоже роутер только более блатной и удобный как видим

Последний раз редактировалось Mахmахmахimus, 19.02.2012 в 03:16.
Ответить с цитированием
  #5 (permalink)  
Старый 16.03.2012, 12:17
Новичок на форуме
Отправить личное сообщение для mycrashedmind Посмотреть профиль Найти все сообщения от mycrashedmind
 
Регистрация: 03.07.2011
Сообщений: 2

разобрать было интересно, только зачем создавать классовый подход в js?
Ответить с цитированием
Ответ



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

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


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