Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ООП в javascript (https://javascript.ru/forum/misc/29791-oop-v-javascript.html)

iostream21 11.07.2012 14:50

ООП в 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);

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

Цитата:

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

мне казалось паттерн применяется / выбирается в зависимости от ситуации и лучше / хуже здесь не уместно

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/O...ster/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
забанят же снова..

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


Часовой пояс GMT +3, время: 18:28.