首先这篇文章是由
https://segmentfault.com/a/1190000012841509
得到的答案,讲解非常详细;
首先是一个polyfill
Object.setPrototypeOf = Object.setPrototyoeOf || function(obj, proto){
obj.__proto__ = proto;
return obj;
}
核心代码:(以一个二维矩阵为例、继承Array),Date类似
function Matrix2D(n,m,initnum){
//下面两种写法也可以apply的第一个参数,只要是typeof X结果为function的应用类就可以
var mt = new (Function.prototype.bind.apply(Array,[Array]))();
//var mt = new (Function.prototype.bind.call(Boolean,Array))();
//var mt = new (Function.bind(Array))();
//把实例挂载回去,不然无法调用Matrix2D原型上面的方法
Object.setPrototypeOf(mt, Matrix2D.prototype);
for(let i = 0;i<n;i++){
mt[i] = Array(m);
for(let j = 0;j<m;j++){
mt[i][j] = initnum || 0
}
};
//行
mt.row = n;
//列
mt.column = m;
return mt;
}
//最后是把类指向Array,才算继承
Object.setPrototypeOf(Matrix2D.prototype, Array.prototype);
Matrix2D.prototype.test = function(){
return 123;
}
测试
var m = new Matrix2D(3,6)//初始化一个3*6的矩阵
console.log(m.row)// 3
console.log(m.col)// 6
//继承
console.log(m instanceof Array)//true
console.log(m instanceof Matrix2D)//true
//原型上的方法
console.log(m.test())//123
总结
非常实用的一个继承方法。记录一下