ООП в javascript
Существует множество паттернов для реализации ООП в яваскрипте и каждый пытается доказать что его реализация лучше. Расширение через прототипирование и прочие.
Хотелось бы узнать ваше мнение по поводу следующего кода, представленным ниже образом я реализую механизм ООП для скрипта который пишу, что вы можете посоветовать в данном случае и на какие грабли в будущем я могу наступить.
//internal class Animal
var Animal = function () {
var animal = this;
//public variables and methods
animal.satiety = 0;
animal.eat = function () {
eat();
};
animal.getFood = function () {
return animal.satiety;
};
//private variables and methods
function eat() {
satiety++;
}
//constructor
(function () {
})();
//static methods
Animal.voice = function () {
console.log("Voice");
};
return animal;
};
// internal class Horse
var Horse = function () {
Horse = Animal;
var horse = new Animal();
//override parent function
horse.eat = function (count) {
horse.satiety += count;
};
horse.getFood = function () {
console.log("FOOD : " + horse.satiety);
};
return horse;
};
var horse = new Horse();
horse.eat(12);
Horse.voice();
horse.getFood();
console.log(horse);
|
как и в большинстве ООП-реализаций на JS, отличие следующее.
вот классы, допустим, на питоне: Код:
class Animal:в вашем примере с тем, чтобы разобраться придётся помучиться и поизображать из себя интерпретатор. когда 2 класса, это терпимо. когда их 100, тут уже запутаешься. |
Цитата:
|
по мелочи:
- нет конструктора, вызывающегося при инициализации объекта. - на каждый объект создаётся полный набор методов. ну и 34-я строка вводит меня в ступор |
Плюсы:
- удобный красивый код Минусы: - код плохо оптимизирован (лучше использовать прототипы) * представьте, что вам придется создать 1000 объектов Animal, и каждый из них продублирует создание КАЖДОГО свойства (то есть некоторые методы и свойства будут создаваться 1000 раз!) * зачем нужен метод animal.getFood, если он возвращает PUBLIC переменную? * лишняя самовызывающаяся функция (рядом с комментарием constructor); помните, что функция - это объект в Javascript, и вы создаете лишний объект, без которого вполне можно обойтись * Animal.voice по идее - статичный метод, и его нужно убрать за пределы конструктора объекта, а не инициализировать при каждом создании объекта Animal СЕРЬЕЗНАЯ ОШИБКА: - дополните ваш код следующим: var horse2 = new Horse(); horse2.getFood(); По идее должна создасться еще одна лошадь с переопределенным методом getFood, но после того как вы создали первую лошадь и указали Horse = Animal; все ваши последующие объекты Horse становятся простыми Animal. Вобщем, никакого наследования на самом деле не получится тут. Что делать? Использовать прототипы. Очень тяжело для того, кто привык работать с другими языками программирования типа Java, C++, но лучше потратить несколько дней на понимание прототипов. |
вот лучший ООП на javascript, лучше вы просто не найдете.
https://github.com/Livanderiamarum/O...ster/README.md |
Да, я действительно погорячился на счет 34 строчки ))))
Всем спасибо за комментарии, очень содержательно |
iostream21,
вот лучший ООП на javascript, лучше вы просто не найдете. Не проходите мимо, покупайте. https://github.com/Livanderiamarum/O...ster/README.md |
Drimogemon,
не спамь, забанят же снова.. Все уже видели твою реализацию, и нет смысла ее пиарить тут без конца. |
Цитата:
|
Цитата:
|
devote, ну ладно , как будет напиши че нить, и поищи косяки, не в смысле реализации а в смысле чего бы хотелось чтобы можно было делать а этого делать не получается. и где не интуитивное поведение и.т.п.
|
| Часовой пояс GMT +3, время: 08:29. |