Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Классы в javascript harmony. (https://javascript.ru/forum/offtopic/25893-klassy-v-javascript-harmony.html)

Mахmахmахimus 19.02.2012 02:22

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

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



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

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


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

ИМЕЛО бы доступ к приватным этого cat1
правильно ли это?

Mахmахmахimus 19.02.2012 02:22

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)

Nekromancer 19.02.2012 02:59

Mахmахmахimus,
Harmony тут причём?

Mахmахmахimus 19.02.2012 03:12

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

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

mycrashedmind 16.03.2012 12:17

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


Часовой пояс GMT +3, время: 03:21.