Вход

Просмотр полной версии : ООП в javascript


iostream21
11.07.2012, 14:50
Существует множество паттернов для реализации ООП в яваскрипте и каждый пытается доказать что его реализация лучше. Расширение через прототипирование и прочие.

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

//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);

vasa_c
11.07.2012, 15:21
как и в большинстве ООП-реализаций на JS, отличие следующее.
вот классы, допустим, на питоне:

class Animal:
def func1(self):
pass

class Horse (Animal):
def func2(self):
pass

horse = Horse()


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

когда 2 класса, это терпимо. когда их 100, тут уже запутаешься.

nerv_
11.07.2012, 15:22
Существует множество паттернов для реализации ООП в яваскрипте и каждый пытается доказать что его реализация лучше.
мне казалось паттерн применяется / выбирается в зависимости от ситуации и лучше / хуже здесь не уместно

vasa_c
11.07.2012, 15:25
по мелочи:
- нет конструктора, вызывающегося при инициализации объекта.
- на каждый объект создаётся полный набор методов.

ну и 34-я строка вводит меня в ступор

almac
11.07.2012, 15:35
Плюсы:
- удобный красивый код

Минусы:
- код плохо оптимизирован (лучше использовать прототипы)
* представьте, что вам придется создать 1000 объектов Animal, и каждый из них продублирует создание КАЖДОГО свойства (то есть некоторые методы и свойства будут создаваться 1000 раз!)
* зачем нужен метод animal.getFood, если он возвращает PUBLIC переменную?
* лишняя самовызывающаяся функция (рядом с комментарием constructor); помните, что функция - это объект в Javascript, и вы создаете лишний объект, без которого вполне можно обойтись
* Animal.voice по идее - статичный метод, и его нужно убрать за пределы конструктора объекта, а не инициализировать при каждом создании объекта Animal

СЕРЬЕЗНАЯ ОШИБКА:
- дополните ваш код следующим:
var horse2 = new Horse();
horse2.getFood();
По идее должна создасться еще одна лошадь с переопределенным методом getFood, но после того как вы создали первую лошадь и указали Horse = Animal; все ваши последующие объекты Horse становятся простыми Animal. Вобщем, никакого наследования на самом деле не получится тут.

Что делать? Использовать прототипы. Очень тяжело для того, кто привык работать с другими языками программирования типа Java, C++, но лучше потратить несколько дней на понимание прототипов.

Drimogemon
11.07.2012, 19:27
вот лучший ООП на javascript, лучше вы просто не найдете.

https://github.com/Livanderiamarum/OOPjavascript/blob/master/README.md

iostream21
11.07.2012, 20:07
Да, я действительно погорячился на счет 34 строчки ))))

Всем спасибо за комментарии, очень содержательно

Drimogemon
11.07.2012, 20:11
iostream21,
вот лучший ООП на javascript, лучше вы просто не найдете. Не проходите мимо, покупайте.

https://github.com/Livanderiamarum/O...ster/README.md

devote
11.07.2012, 20:41
Drimogemon,
не спамь, забанят же снова.. Все уже видели твою реализацию, и нет смысла ее пиарить тут без конца.

Drimogemon
11.07.2012, 21:41
забанят же снова..
так максимус из бана выходит седня, по этому дримогемона не жалко, ну а вообще да, не хочется быть навязчивым, но хочется критики и тестов. а ты, кто шарит, мне не помогаешь.. Я попросил дать пример использования приватных свойств, а не протектед. А ты так и забил...

devote
11.07.2012, 21:45
А ты так и забил...
ну вообще то у меня полно других дел, и времени кроме как написать какой нить ответ тут, пока ни на что нет.

Drimogemon
12.07.2012, 00:16
devote, ну ладно , как будет напиши че нить, и поищи косяки, не в смысле реализации а в смысле чего бы хотелось чтобы можно было делать а этого делать не получается. и где не интуитивное поведение и.т.п.