原型继承和扩展现有对象

时间:2012-03-14 17:40:37

标签: javascript inheritance call prototype extend

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,但我不确定我需要做的是以通用方式扩展现有密钥,而不将configEditor.Advanced.prototype移动到构造函数并使用push函数。

1 个答案:

答案 0 :(得分:-1)

在JavaScript中扩展Object的正确方法是使用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