function inheritClass(fatherCls, sonClsName, params) {
//
//fatherCls: class, parent class.
//sonClsName: string, name of son class.
//params: list, list of parameters of parent and son class, parameters are all string.
//eg, let D = inheritClass(A, 'D', ['model', 'color', 'size']);
//D is the son class which extends parent class - A.
//A is the parent class.
//'D' is the name of son class, must equal variable D which will be assigned to.
//'model' is the parameter inherit from parent class, should be in the front of list.
//'color', 'size' are new parameters of son class, should be at end.
let fatherParams = params.slice(0,fatherCls.length);
let sonParams = params.slice(fatherCls.length);
let fPhrase = fatherCls.name + '.call(this,' + fatherParams + ');';
let sPhrase = '';
for(let len = sonParams.length, i = 0; i < len; i++){
sPhrase += 'this.' + sonParams[i] + '=' + sonParams[i] + ';';
}
let Son = new Function(params, fPhrase + sPhrase);
Object.defineProperty(Son, 'name', {value: sonClsName});
function tmp(){};
tmp.prototype = fatherCls.prototype;
Son.prototype = new tmp();
Son.prototype.constructor = Son;
// Object.defineProperty(Son.prototype.constructor, 'name', {value: sonClsName});
return Son;
}
举例:
function A(model) {
this.model = model;
}
Parent.prototype = {
getModel: function () {
return this.model;
},
setModel: function (model) {
this.model = model;
}
}
let Son = inheritClass(Parent, 'Son', ['model', 'color', 'size']);
Son.prototype.getColor = function() {
return this.color;
}
Son.prototype.getSize = function() {
return this.size;
}
let son = new Son('D_model', 'dark', 'DLL');
console.log(son instanceof parent); //true
let Grandson = inheritClass(Son, 'Grandson', ['model', 'color', 'size', 'patten']);
Grandson.prototype.getPatten = function (){
return this.patten;
}
let grandson = new Grandson('E_model', 'green', 'EX', 'flower');
console.log(grandson instanceof Parent); //true