原型继承和扩展现有对象

Prototype inheritance and extend existing objects

本文关键字:对象 扩展 继承 原型      更新时间:2023-09-26
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函数。

在 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