В 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
объект?
Ну, вы просто не можете сделать это таким образом, если вы планируете сделать много млекопитающих
или кошек
. Вместо этого сделайте все по старинке (прототип) и наследуйте по свойствам. Вы можете сделать конструкторы так, как описано выше, но вместо that
и my
вы используете неявный this
и некоторую переменную, представляющую базовый класс (в данном примере this.mammal
).
cat.prototype.purr = function() { return this.mammal.clearThroat() + "purr"; }
Я бы использовал другое имя, отличное от my
, для доступа к базе и хранил его в this
в конструкторе cat
. В этом примере я использовал mammal
, но это может быть не лучшим вариантом, если вы хотите иметь static доступ к глобальному объекту mammal
. Другой вариант - назвать переменную base
.