Наследование прототипов и расширение существующих объектов - PullRequest
3 голосов
/ 14 марта 2012
var Editor = {};

Editor.Basic = function(obj) {
    this.config ={
        value: obj
    }
};

Editor.Basic.prototype = {
    getValue: function() {
        return this.config.value;
    }
};

Editor.Advanced = function(obj) {
    Editor.Basic.call(this, obj);
};

Editor.Advanced.prototype = {
    config: {
        notValue: !this.config.value
    }
};

var extendByPrototype = function(obj1, obj2) {
    for (var key in obj2.prototype) {
        if (obj2.prototype.hasOwnProperty(key) && obj1.prototype[key] === undefined)
            obj1.prototype[key] = obj2.prototype[key];
    }
};

extendByPrototype(Editor.Advanced, Editor.Basic);

Есть ли способ заставить Editor.Advanced.prototype расширять существующие объекты (конечно же, рекурсивно) вместо их переопределения?(Как видно из extendByPrototype)

Я знаю, что проверю obj1.prototype[key] !== undefined, но я не уверен, что мне нужно сделать, чтобы расширить существующие ключи общим способом, не перемещая config из Editor.Advanced.prototype в конструктор и используя функцию push.

1 Ответ

0 голосов
/ 14 марта 2012

Правильный способ расширения объекта в JavaScript - это использование Object.create(prototype). Созданные таким образом объекты будут иметь правильную настройку наследования. Чтобы получить прототип любого объекта, вы будете использовать Object.getPrototypeOf(object).

Object.create(prototype) является новым в JavaScript 1.8.5. Если вы ищете обратную совместимость, вам придется использовать нестандартный способ

function extend(child, supertype) {  
  child.prototype.__proto__ = supertype.prototype;  
}  

extend(Animal, Lifeform);  
extend(Plant, Lifeform);  

var anOnion = new Plant();  

После этого вы можете получить объект-прототип ...

object.contructor.__proto__

Подробнее о __proto__ здесь: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/proto

...