Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.07.2012, 14:50
Интересующийся
Отправить личное сообщение для iostream21 Посмотреть профиль Найти все сообщения от iostream21
 
Регистрация: 11.07.2012
Сообщений: 23

ООП в 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);
Ответить с цитированием
  #2 (permalink)  
Старый 11.07.2012, 15:21
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

как и в большинстве ООП-реализаций на JS, отличие следующее.
вот классы, допустим, на питоне:
Код:
class Animal:
    def func1(self):
        pass

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

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

когда 2 класса, это терпимо. когда их 100, тут уже запутаешься.
Ответить с цитированием
  #3 (permalink)  
Старый 11.07.2012, 15:22
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от iostream21
Существует множество паттернов для реализации ООП в яваскрипте и каждый пытается доказать что его реализация лучше.
мне казалось паттерн применяется / выбирается в зависимости от ситуации и лучше / хуже здесь не уместно
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 11.07.2012, 15:25
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

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

ну и 34-я строка вводит меня в ступор
Ответить с цитированием
  #5 (permalink)  
Старый 11.07.2012, 15:35
Аспирант
Отправить личное сообщение для almac Посмотреть профиль Найти все сообщения от almac
 
Регистрация: 29.06.2012
Сообщений: 31

Плюсы:
- удобный красивый код

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

СЕРЬЕЗНАЯ ОШИБКА:
- дополните ваш код следующим:
var horse2 = new Horse();
horse2.getFood();

По идее должна создасться еще одна лошадь с переопределенным методом getFood, но после того как вы создали первую лошадь и указали Horse = Animal; все ваши последующие объекты Horse становятся простыми Animal. Вобщем, никакого наследования на самом деле не получится тут.

Что делать? Использовать прототипы. Очень тяжело для того, кто привык работать с другими языками программирования типа Java, C++, но лучше потратить несколько дней на понимание прототипов.
Ответить с цитированием
  #6 (permalink)  
Старый 11.07.2012, 19:27
Аватар для Drimogemon
Профессор
Отправить личное сообщение для Drimogemon Посмотреть профиль Найти все сообщения от Drimogemon
 
Регистрация: 02.07.2012
Сообщений: 106

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

https://github.com/Livanderiamarum/O...ster/README.md
Ответить с цитированием
  #7 (permalink)  
Старый 11.07.2012, 20:07
Интересующийся
Отправить личное сообщение для iostream21 Посмотреть профиль Найти все сообщения от iostream21
 
Регистрация: 11.07.2012
Сообщений: 23

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

Всем спасибо за комментарии, очень содержательно
Ответить с цитированием
  #8 (permalink)  
Старый 11.07.2012, 20:11
Аватар для Drimogemon
Профессор
Отправить личное сообщение для Drimogemon Посмотреть профиль Найти все сообщения от Drimogemon
 
Регистрация: 02.07.2012
Сообщений: 106

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

https://github.com/Livanderiamarum/O...ster/README.md
Ответить с цитированием
  #9 (permalink)  
Старый 11.07.2012, 20:41
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Drimogemon,
не спамь, забанят же снова.. Все уже видели твою реализацию, и нет смысла ее пиарить тут без конца.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #10 (permalink)  
Старый 11.07.2012, 21:41
Аватар для Drimogemon
Профессор
Отправить личное сообщение для Drimogemon Посмотреть профиль Найти все сообщения от Drimogemon
 
Регистрация: 02.07.2012
Сообщений: 106

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
JavaScript client и server side игры Москва 110 000 Yanazavr Работа 0 25.03.2012 14:16
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
JavaScript: ООП Ars_Art Общие вопросы Javascript 13 09.02.2010 02:32