(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() |
ПОКА свойства можно добавлять только так
this.private('name', value) this.private({'name': value, 'bar': function(){}}) получать так this.private('name') либо так this.name поиск будет идти так private => static => public как по мне так такой интерфейс не очень удобный я бы предпочел просто this.private.name = "value" по этому сделаю версию с проксями. |
|
Я к тому, что без наследования этот код бессмысленнен. Или я что-то недоглядел?
|
Цитата:
Можешь сказать пару слов, не давая ссылки на литературу. Мне нужен живой ответ. Так как он конкретнее и короче. Классы могут наследовать от классов, так же классы могут наследовать от СУЩНОСТЕЙ, так?) п.с. ну еще конеш присваивать можно вот так this.__private__.d = 4; alert(this.d) доступны this.__private__ this.__public__ this.__static__ как обычно |
Хз о чем ты. Я в традиционном ООП разбираюсь не больше твоего.
|
Цитата:
public static property или private static property или protected static property А еще бывают abstract поля, abstract классы, интерфейсы. Ждем от тебя реализации полноценных классов на JS |
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' : "общее приватное свойство" }) }) |
Слушайте, я не знаю как сделать чтобы паблик свойства делились на статические и обычные, при том чтобы они находились НА ПРЯМУЮ в обьекте. Это обязательно? А то я бы засунул в цепочку прототипов. Или так нельзя?
|
poorking,
Раз к статик свойствам не обращаются на прямую из контекста экземпляра, то когда к ним обращаются? |
Часовой пояс GMT +3, время: 05:34. |