Во-первых, я предлагаю два изменения в вашем коде (которые будут использоваться в примерах): this.storage
должен быть объектом {}
, так как похоже, что вы никогда не используете его в качестве массива. Кроме того, get
и set
должны быть в прототипе, в противном случае новый экземпляр этих методов будет создан для каждого объекта экземпляра (если только умный компилятор не оптимизирует их, но мы не будем так много предполагать).
Решение 1: вы можете выполнить квази-наследование, при этом только ваши хранилища методы предоставляются наследующим классам, но не хранилище объект :
function Storage(){}
storage.prototype = {
get: function(key){
return this.storage[key];
},
set: function(key, value){
this.storage[key] = value;
}
};
function Collection(){
this.storage = {};
}
Collection.prototype = Storage.prototype; // quasi-inheritance
function EixoCollection(){}
EixoCollection.prototype = new Collection();
function OfertaCollection(){}
OfertaCollection.prototype = new Collection();
var ofertaCollection = new OfertaCollection();
var eixoCollection = new EixoCollection();
ofertaCollection.set('mykey', 'myvalue');
alert(eixoCollection.get('mykey')); // undefined
Решение 2. Реальное наследование, но создание нового хранилища для каждой коллекции, поэтому во время поиска прототипа функция находит локальное хранилище. Это идентично вышеуказанному, но наследование будет таким же, как и раньше. Поэтому я просто заменю строку, которая отличается:
Collection.prototype = new Storage(); // real inheritance
Проблема обеих этих реализаций заключается в том, что они требуют, чтобы наследующий класс выполнял две вещи: и наследовал методы, и создавал хранилище. Не очень.
Простая альтернатива, и, возможно, самая интуитивная, состоит в том, чтобы каждый раз использовать Storage
составной объект, а не унаследованный. Коллекция имеет внутреннее хранилище и некоторые дополнительные функциональные возможности, поэтому она выполняет мнемоническую операцию has-a , которая делает правильного кандидата.