参考资料
不要讲什么设计模式 , 看得老子脑袋昏 , 智商欠费 , 仍是简单点 , 方案 , 继承 , 就完事了html
// 首先咱们得有个父类
// 这个父类也很简单
function Human(name) {
this.name = name || '肥宅' // 有参就取参 , 没参就叫肥宅
}
Human.prototype.drink = function(drinks) {
console.log(this.name + '正在喝' + (drinks || '可乐'));
}
复制代码
OK, 咱们如今有了一个父类, 先来看一个最简单的继承设计模式
直接把父类的实例做为子类的原型函数
// 先写个空类
function Jianren(){}
Jianren.prototype = new Human()
// new个实例看看
var haidong = new Jianren();
console.log(haidong.name); //'肥宅'
console.log(haidong.drink()); //'haidong正在喝可乐'
复制代码
对于这个继承, 归纳为子类的原型链绑定父类的实例实现继承性能
缺陷ui
复制父类属性this
function Jianren(){
Human.call(this);// 把父类写进子类构造函数内部, 调用call把子类的this传进去改变this的指向作到复制父类属性
this.age = 22
}
复制代码
在子类内部添加一个属性, 该属性为父类的实例spa
function Jianren(name){
var ren = new Human();// 注意这里是否是this
ren.name = name || 'haidong';
return ren;
}
复制代码
function Jianren(name){
var ren = new Human()
for(var r in ren) {
Cat.prototype[r] = ren[r] // 该处r是key, 应该用Object[key]的形式赋值和访问
}
Jianren.prototype.name = name || 'haidong'
}
复制代码
上面的继承主要是帮助理解, 或有时暴力快速解决小问题时使用 .prototype
推荐一, 组合继承设计
子类的原型指向父类实例,该父类实例又可向上原型查找访问,修正后constructor指向子类自身code
function Jianren(name) {
Human.call(this) //第一步拷贝属性
this.name = name || 'haidong'
}
Jianren.prototype = new Human() //第二步, 原型指向父类实例
Jianren.prototype.constructor = Jianren //第三步, 修正constructor指向
复制代码
推荐二, 寄生组合继承
// 有点复杂
function Jianren(name) {
Human.call(this) //第一步拷贝属性
this.name = name || 'haidong'
}
(function() { //来个匿名当即执行函数
function J() {}// 建立一个中间类, 空, 什么都没有
J.prototype = Human.prototype //第二步中间类原型指向父类原型
Jianren.prototype = new J() //子类原型赋值为中间类的实例,往上查找,指向了父类的原型
})()
Jianren.prototype.constructor = Jianren //修正子类constructor指向
复制代码
与上面的组合继承相比, 第一步拷贝 和 第二步中间类(空类)不会重复有Human的属性, 略微复杂, 能够忽略不计, 完美方式