Как правильно выстраивать ООП(инкапсуляцию, наследование) на js?

PooH

подскажите как принято реализовывать в JS такие вещи как:
статические методы, переменные
приватные переменные и методы
наследование
сейчас использую собственный велосипед
статические методы и переменные - объявляю их в прототипе объекта и все вызовы и изменения проходят через прямой вызов прототипа (class.prototype.staticVar class.prototype.staticMethod ) - выглядит как стремный костыль, но работает вроде нормально
приватные члены - просто объявляю их в конструкторе, получаются замкнутые в конструкторе члены - вот уже все становится корявым: методы, которые работают с приватными членами сами должны объявляться в конструкторе (т.к. иначе они не попадают в область видимости) и соот-но в прототип их занести не получается
наследование - тоже кривое: ввожу функцию наследования (inherit которая по сути заносит родителя в прототип потомку
при этом в конструкторе потомка приходится вызывать напрямую конструктор родителя, что сильно связывает всю систему
кто что может подсказать по этому поводу?

Bibi

что на эту тему ты уже прочитал?

NAIL

статистические методы, переменные
что за звери?

PooH

что на эту тему ты уже прочитал?
javascript.ru
stackoverflow
если кто посоветует нормальную книжку (а не всякую фигню то буду очень признателен
интересует не конкретные реализации (т.е. как сделать я знаю а системный подход - типа лучше делать так, тут такой шаблон, это работает быстрее и память экономит и т.д.

PooH

что за звери?
на работе рефакторил большой код по разным статистическим выборкам - вот и заело :)
статические, конечно

pilot

если кто посоветует нормальную книжку (а не всякую фигню то буду очень признателен
Читать надо статьи на английском. Гугл в помощь. О наследовании их полно.
Про приватные штуки: можно прочитать что бывают языки программирования в которых их нет, посмотреть как они решают этот вопрос и почему, и перестать париться.
Со статическими вопрос непонятен (мне).

PooH

я пока видел два способа наследования: первый - берем прототип потомка и засовываем в него экземпляр родителя (способ через new и доп. функцию inherit )
второй - тупо дополняем потомка родителем (что-то вроде фабрики объектов)
и тот и другой вариант выглядит как говно на костылях, хочется чего-то красивого и логичного

PooH

О наследовании их полно.
так я хочу узнать, что лучше, т.е. тут нужен опыт
а конкретные реализации я и сам могу написать, проблема в идее

PooH

Про приватные штуки: можно прочитать что бывают языки программирования в которых их нет
ну в JS я их эмулирую через замыкания
совсем без них тяжело - хочется разделять интерфейс и логику

PooH

сегодня покопался и сделал несколько выводов
запощу сюда, если кому будет интересно
организация механизма наследования:
 
 

// функция наследования
// необходимый костыль для реализации наследования в JS
// делает класс Child потомком Parent
function extend(Child, Parent) {
var F = function { }
F.prototype = Parent.prototype
Child.prototype = new F
Child.prototype.constructor = Child
Child.superclass = Parent.prototype
}


// пример двух классов

/* класс Parent
все, что присвоено в конструкторе
не будет наследоваться потомками */
function Parent {
var privateVar = "I'm private"; // приватная переменная, будет доступна только в замыкании конструктора
var getPrivateVar = function { // геттер для приватной переменной
return privateVar;
}
var setPrivateVar = function(val) { // сеттер для приватной переменной
if(validate(val // стоит дописать фильтрацию и валидацию
return privateVar = val;
}

var privateMethod =
function(params) {...} // приватный метод

this.publicVar = "I'm public"; // публичная переменная

this.publicMethod =
function(params) {...} // публичный метод
}
// реализация статических методов
mixin(Parent.prototype, {
staticVar : "I'm static",
staticMethod : function(params) { // статичный метод, будет унаследован потомками
return Parent.prototype.
staticVar +=" and changed"; // реализуется тем, что обращение к статичной переменной только через прототип
}, // при этом надо отслеживать, чтобы запись прототипа не перекрывалась записью объекта

inheritedPublicMethod :
function(params) {...} // публичный метод, будет унаследовани потомками

});

/* класс Child, потомок Parent
все, что было присвоено через
прототип будет унаследовано */
function Child{...} // важно! при такой организации наследования
inherit(Parent, Child); // не нужно вызывать в конструкторе потомка
mixin(Child.prototype, {...}) // конструктор родителя, все наследование через прототип

Ushkvarok

приватные члены - просто объявляю их в конструкторе, получаются замкнутые в конструкторе члены - вот уже все становится корявым: методы, которые работают с приватными членами сами должны объявляться в конструкторе (т.к. иначе они не попадают в область видимости) и соот-но в прототип их занести не получается
я вот так делаю, когда испытываю потребность в приватных методах:

var MyClass = function {

this.prop = "asdf";

this.publicMethod = function {
// do stuff

// call private
privateMethod(this);
};

/**
* @param ref {Object} reference to "this"
*/
function privateMethod(ref) {
console.log(ref.prop);
}

};

критикуем?! :)

PooH

критикуем?!
выше уже был пример приватного метода через замыкание конструктора

Ushkvarok

кстати да, и вышеприведенным способом лучше
не надо передавать this аргументом

PooH

решил выбить из головы классовые привычки и переписал код под паттерн "наблюдатель" (точнее это очень вольная вариация)
получилось компактно, красиво и удобно
и асинхронно
Оставить комментарий
Имя или ник:
Комментарий: