javascript中的2级继承

时间:2014-06-20 05:37:36

标签: javascript inheritance

我试图在没有任何框架的情况下在javascript中实现2级继承。

**Class --> Model --> ListModel**

理想情况下,代码应该如下所示

var Class = function(){}
var Model = new Class;
var ListModel = new Model;

实施后,我可以提供以下解决方案,其味道很糟糕。

var Class = function(){

    klass = function(){};

    klass.extend = function(){ console.log("extend")}
    klass.prototype.include = function(){ console.log("include") };

    return klass
}


var Model = function(parent){

    var model = function(){

    }   

    if(parent){

        for(var i in parent){
            model[i] = parent[i];
        }   
        for(var i in parent.prototype){
            model.prototype[i] = parent.prototype[i];
        }       
    }

    model.record = [1,2];
    model.prototype.generateId = function(){ console.log("genrate ID")};

    return model 
}

var ListModel = function(parent){

    if(parent){

        for(var i in parent){
            ListModel[i] = parent[i];
        }   
        for(var i in parent.prototype){
            ListModel.prototype[i] = parent.prototype[i];
        }       
    }


}

var class = new Class()
var model = new Model(class)
var l = new ListModel(model)

有人可以帮助我以更好的方式做到这一点。

1 个答案:

答案 0 :(得分:1)

我通常使用一个名为defclass的函数来定义“类”(实际上是构造函数),它们不会从其他任何东西继承:

function defclass(prototype) {
    var constructor = prototype.constructor;
    constructor.prototype = prototype;
    return constructor;
}

使用defclass您可以按如下方式创建类:

var Model = defclass({
    constructor: function (...) {
        // init code
    },
    someMethod: function (...) {
        // do something
    }
});

当涉及到继承时,你需要更多东西。所以我写了自己的extend函数:

function extend(constructor, keys) {
    var supertype = keys.super = constructor.prototype;
    var prototype = Object.create(supertype);
    for (var key in keys) prototype[key] = keys[key];
    return defclass(prototype);
}

使用extend,您现在可以继承其他类,如下所示:

var ListModel = extend(Model, {
    constructor: function (...) {
        // init code
    },
    someMethod: function (...) {
        // override default implementation
        // use `this.super` to gain access to overridden methods
    },
    someOtherMethod: function (..) {
        // do something else
    }
});

简单不是吗?