JavaScript функциональное наследование с прототипами

В JavaScript Douglas Crockford: Хорошие Части он рекомендует, чтобы мы использовали функциональное наследование. Вот пример:

var mammal = function(spec, my) {
    var that = {};
    my = my || {};

    // Protected
    my.clearThroat = function() { 
        return "Ahem";
    };

    that.getName = function() {
        return spec.name;
    };

    that.says = function() {
        return my.clearThroat() + ' ' + spec.saying || '';
    };

    return that;
};

var cat = function(spec, my) {
    var that = {};
    my = my || {};

    spec.saying = spec.saying || 'meow';
    that = mammal(spec, my);

    that.purr = function() { 
        return my.clearThroat() + " purr"; 
    };

    that.getName = function() { 
        return that.says() + ' ' + spec.name + ' ' + that.says();
    };

    return that;
};

var kitty = cat({name: "Fluffy"});

Основной вопрос, который я имею с этим, - то, что каждый раз я делаю a mammal или cat интерпретатор JavaScript должен перекомпилировать все функции в нем. Таким образом, Вы не добираетесь для совместного использования кода между экземплярами.

Мой вопрос: как я делаю этот код более эффективным? Например, если я делал тысячи cat объекты, что лучший способ состоит в том, чтобы изменить этот шаблон для использования в своих интересах prototype объект?

13
задан cdmckay 14 March 2010 в 02:37
поделиться

1 ответ

Ну, вы просто не можете сделать это таким образом, если вы планируете сделать много млекопитающих или кошек. Вместо этого сделайте все по старинке (прототип) и наследуйте по свойствам. Вы можете сделать конструкторы так, как описано выше, но вместо that и my вы используете неявный this и некоторую переменную, представляющую базовый класс (в данном примере this.mammal).

cat.prototype.purr = function() { return this.mammal.clearThroat() + "purr"; }

Я бы использовал другое имя, отличное от my, для доступа к базе и хранил его в this в конструкторе cat. В этом примере я использовал mammal, но это может быть не лучшим вариантом, если вы хотите иметь static доступ к глобальному объекту mammal. Другой вариант - назвать переменную base.

8
ответ дан 2 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: