на ум приходят более дурацкие махинации с JavaScript - PullRequest
0 голосов
/ 31 марта 2011

Я только что прочитал Майк Косс об объектно-ориентированном программировании в JavaScript . Он кратко говорит о подклассе и затрагивает «альтернативную парадигму подкласса». После этого примера Косс пишет ...

К сожалению, эта техника не разрешить использование instanceof оператор для проверки на членство в супер-класс. Но мы добавили выгода, которую мы можем извлечь из более чем один суперкласс (несколько наследование)

... и это заставило меня задуматься. Идея множественного наследования кажется классной! Итак, у меня есть два набора вопросов:

  1. Практична ли идея множественного наследования? Это на самом деле практикуется? Какие-либо преимущества или недостатки?
  2. Как бы я переопределил оператор instanceof, чтобы расширить его функциональность до множественного наследования?

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Эмулированное множественное наследование в javascript становится кошмаром.

Я написал целую пользовательскую оболочку класса, чтобы разрешить динамическое множественное наследование, и отказался от нее через месяц, потому что это просто не стоит.Сложность растет из-под контроля.

Вместо того, чтобы использовать множественное наследование, вы можете расширить свой объект методами его родителей.

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

Если вы хотите, чтобы множественное наследование придерживалось композиции объекта.

Будьте осторожны: при этом используется_ для простоты и краткости.

function Child() {
    var parent1 = new Parent1();
    var parent2 = new Parent2();
    // bind this to parent1 so it's got it's own internal scope
    _.bindAll(parent1);
    _.bindAll(parent2);
    // extend this with parent1 and parent2
    _.extend(this, parent1);
    _.extend(this, parent2);
}

Да, вы теряете instanceof проверку.Разобраться с этим.

В более общем смысле вы можете расширить любой объект, который вам нужен.

function extend(f, arr) {
    // return a new function to replace f.
    return function() {
        // store the correct this value
        var that = this;
        // call original f
        f.apply(this, arguments);
        // for each parent call it with the original this
        _.each(arr, function(v) {
            v.apply(that, arguments);
        });
        // add f to the parent array
        arr.push(f);
        // store the array on the object to use with instance_of
        this.__instance = arr;
    }
}

function instance_of(o, klass) {
    // is the klass included in the .__instance array  ?
    return _.include(o.__instance, klass);
}

function Child() {
    // do stuff
    this.method = function() { console.log("method"); return this;};
}

function Parent1() {
    this.foo = function() { console.log("foo"); return this; };
}

function Parent2() {
    this.bar = function() { console.log("bar"); return this;};
}

Child = extend(Child, [Parent1, Parent2]);
var c = new Child();
console.log(instance_of(c, Parent1)); // true
console.dir(c);
c.method().foo().bar();

Это зависит от underscore.js для реализации некоторых хороших абстракций для сохраненияПример кода маленький. .extend , .bindAll .

См. живой пример

1 голос
/ 31 марта 2011

Структура класса Джона Ресига , как и многие другие, допускают проверки instanceof.

Вы не сумасшедшие, когда думаете о переопределении instanceof (я на самом деле рекомендую вам мысльчто-то я бы сделал :)), но это невозможно.instanceof - это не функция, это ключевые слова javascript, которые анализируются компилятором и поэтому невозможно переопределить.

Что касается множественного наследования, никто не использует его на практике, потому что невозможно отследить.Что происходит, когда два родительских класса реализуют одну и ту же вещь?Который имеет приоритет?Как вы отличаете их от детского класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...