ООП в 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,
не спамь, забанят же снова.. Все уже видели твою реализацию, и нет смысла ее пиарить тут без конца. |
Цитата:
|
Часовой пояс GMT +3, время: 16:55. |