我试图在没有任何框架的情况下在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)
有人可以帮助我以更好的方式做到这一点。
答案 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
}
});
简单不是吗?