Где конкретно прочитать про правильную реализацию ООП на javascript?
Изучая книги по javascript наткнулся на разное трактование способов реализации ООП в данном языке. Одни говорят делай через прототипы, другие копируют свойства и функции, третьи вызывают родительский класс через Call у себя внутри конструктора. Как все таки правильно реализовывать?
Плюс вопрос про доступность методов и переменных, тоже много разночтений. Реализация скрытых методов и переменных тоже не всегда хороша, так как возвращая из объекта внутреннее приватное свойства, например массив, я уже снаружи могу менять значение массива (не понятно как бороться с передачей по ссылке, кроме как возврат копии).
Еще в книгах я так и не увидел толковой реализации архитектуры приложений. Где найти конкретную информацию по этим вопросам?
// Создание супер класса
var SuperClass = function() {
// Создание свойств супер класса
this.prop = "property";
}
// Добавление методов в прототип супер класса
SuperClass.prototype.method = function() {
return this.prop;
};
// Наследование
var SubClass = function() {
// Наследование свойств супер класса
SuperClass.apply(this, arguments);
// создание собственных свойств
this.prop = "property";
}
// Наследование методов супер класса
SubClass.prototype = Object.create(SuperClass.prototype);
// Возврат значения свойства constructor
SubClass.prototype.constructor = SubClass;
// Создание собственных методов
SubClass.prototype.subMethod = function() {
console.log("yo!");
};
// Создания экземпляра класса
var instance = new SubClass();
// Вызов методов экземпляра
instance.subMethod();
console.log(instance.method());
console.log(instance.prop);
Это все понятно, но мне кажется такая реализация слишком сложна. Хочется отдельно описать прототип и отдельно описать наследника и после их связать, как в классическом ООП.
Одни говорят делай через прототипы, другие копируют свойства и функции, третьи вызывают родительский класс через Call у себя внутри конструктора. Как все таки правильно реализовывать?
Плюс вопрос про доступность методов и переменных, тоже много разночтений.
Сначала ES6, потом TypeScript. Если у вас встают такие вопросы, в "классическом" JS (ES5 и ниже) вы не найдете ответов. Например, посмотрите как компилит классы TS или Бабель.
В ES5 есть только две вещи, имеющие какое-то отношение к ООП - выстраивание объектов в цепочку прототипов и объект как словарь ключ-значение.