|

16.02.2012, 02:55
|
|
Профессор
|
|
Регистрация: 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.
|
|
|

16.02.2012, 02:59
|
|
Профессор
|
|
Регистрация: 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.
|
|
|

16.02.2012, 03:00
|
 |
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
|
|
|
|

16.02.2012, 03:01
|
 |
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
|
Я к тому, что без наследования этот код бессмысленнен. Или я что-то недоглядел?
|
|
|

16.02.2012, 03:06
|
|
Профессор
|
|
Регистрация: 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.
|
|
|

16.02.2012, 03:59
|
 |
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
|
Хз о чем ты. Я в традиционном ООП разбираюсь не больше твоего.
|
|
|

16.02.2012, 08:38
|
 |
prodigy
|
|
Регистрация: 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.
|
|
|

16.02.2012, 13:37
|
|
Профессор
|
|
Регистрация: 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.
|
|
|

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

16.02.2012, 14:24
|
|
Профессор
|
|
Регистрация: 10.02.2012
Сообщений: 254
|
|
|
poorking,
Раз к статик свойствам не обращаются на прямую из контекста экземпляра, то когда к ним обращаются?
|
|
|
|