Как правильно выстраивать ООП(инкапсуляцию, наследование) на js?
что на эту тему ты уже прочитал?
статистические методы, переменныечто за звери?
что на эту тему ты уже прочитал?javascript.ru
stackoverflow
если кто посоветует нормальную книжку (а не всякую фигню то буду очень признателен
интересует не конкретные реализации (т.е. как сделать я знаю а системный подход - типа лучше делать так, тут такой шаблон, это работает быстрее и память экономит и т.д.
что за звери?на работе рефакторил большой код по разным статистическим выборкам - вот и заело
статические, конечно
если кто посоветует нормальную книжку (а не всякую фигню то буду очень признателенЧитать надо статьи на английском. Гугл в помощь. О наследовании их полно.
Про приватные штуки: можно прочитать что бывают языки программирования в которых их нет, посмотреть как они решают этот вопрос и почему, и перестать париться.
Со статическими вопрос непонятен (мне).
второй - тупо дополняем потомка родителем (что-то вроде фабрики объектов)
и тот и другой вариант выглядит как говно на костылях, хочется чего-то красивого и логичного
О наследовании их полно.так я хочу узнать, что лучше, т.е. тут нужен опыт
а конкретные реализации я и сам могу написать, проблема в идее
Про приватные штуки: можно прочитать что бывают языки программирования в которых их нетну в JS я их эмулирую через замыкания
совсем без них тяжело - хочется разделять интерфейс и логику
запощу сюда, если кому будет интересно
организация механизма наследования:
// функция наследования
// необходимый костыль для реализации наследования в 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, {...}) // конструктор родителя, все наследование через прототип
приватные члены - просто объявляю их в конструкторе, получаются замкнутые в конструкторе члены - вот уже все становится корявым: методы, которые работают с приватными членами сами должны объявляться в конструкторе (т.к. иначе они не попадают в область видимости) и соот-но в прототип их занести не получаетсяя вот так делаю, когда испытываю потребность в приватных методах:
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);
}
};
критикуем?!
критикуем?!выше уже был пример приватного метода через замыкание конструктора
не надо передавать this аргументом
получилось компактно, красиво и удобно
и асинхронно
Оставить комментарий
PooH
подскажите как принято реализовывать в JS такие вещи как:статические методы, переменные
приватные переменные и методы
наследование
сейчас использую собственный велосипед
статические методы и переменные - объявляю их в прототипе объекта и все вызовы и изменения проходят через прямой вызов прототипа (class.prototype.staticVar class.prototype.staticMethod ) - выглядит как стремный костыль, но работает вроде нормально
приватные члены - просто объявляю их в конструкторе, получаются замкнутые в конструкторе члены - вот уже все становится корявым: методы, которые работают с приватными членами сами должны объявляться в конструкторе (т.к. иначе они не попадают в область видимости) и соот-но в прототип их занести не получается
наследование - тоже кривое: ввожу функцию наследования (inherit которая по сути заносит родителя в прототип потомку
при этом в конструкторе потомка приходится вызывать напрямую конструктор родителя, что сильно связывает всю систему
кто что может подсказать по этому поводу?