воскресенье, 31 октября 2010 г.

JavaScript: Object Oriented or Not?

Все началось с написания клиентских скриптов для существующего веб-приложения с массивным использованием jQuery и асинхронных запросов (aka ajax).

Используется процедурный подход. Я же за ООП, как за средство эффективного снижения сложности.

Ближе к делу.

Поиск по данной теме сразу же привел меня на сайт Дугласа Крокфорда (см. раздел по JavaScript). Не буду пересказывать - очень советую прочесть его статьи по JavaScript - лучшее что я читал за последнее время.

Теперь поделюсь примерами из собственного опыта.

Пространства имен - то, к чему я очень привык, разрабатывая на C++, и особенно на C#.

var Namespace1 = Namespace1 || {};
Namespace1.Namespace2 = Namespace1.Namespace2 || {};

Приватные поля - то, без чего вообще жить нельзя.

Namespace1.Namespace2.Cat = function (name_) {
    var name = name_;
    this.getName = function () {
        return name;
    };
};

Namespace1.Namespace2.Cat.prototype.Meow = function () {
    alert(this.getName() + " says: meow!");
};

Теперь, если выполнить код:

var cat = new Cat("Bluetooth");
cat.name = "WiFi";
cat.Meow();

То "кот промяукает": "Bluetooth says: meow!", но не "WiFi says: meow!".

На этом пока все, в продолжении обязательно расскажу как я реализую наследование.

2 комментария:

  1. На пайконе отлично заметили, что большинство людей сейчас не программируют на JS, а его /используют/.

    Но это лирика. А вот когда ты делаешь
    cat.name = "WiFi";
    то не является ли ожидаемым поведением мяуканье кота именно с новым именем?
    А то кота переименовали, а он все по-старому мяукает...

    ОтветитьУдалить
  2. Тут скорее cat.setName("WiFi") (если такой сеттер был бы).

    Вся фишка в том, чтобы защитить поле, реализовать инкапсуляцию. Плюс сеттеры-геттеры полезны, если нужна дополнительная логика, а не просто присваивание.

    Безусловно, для такого просто юз кейса (как в примере) можно было просто открыть переменную, но смысл был показать инкапсуляцию в действии, и пример был выбран попроще и без заморочек.

    ОтветитьУдалить