本文章仅供本菜鸟记录学习过程:
最近在看《你不知道的JS》这本书:
类是一种设计模式,JS中其实并没有真正的类,但是设计出了与类相似的代码模式
类的继承概念不再赘述,下面解析一下几个概念
多态:
多态指的是任何方法都可以引用,继承层次中高层的方法(即子类可以引用,继承父类身上的方法),其中,方法的多态性取决于你是在哪个类的实例中引用它。
下面是一段伪代码:
class Vehicle {//这个是交通工具父类,定义了一个属性两个方法
engines = 1
ignition() { output("Turning on my engine.");
}
drive() { ignition(); output("Steering and moving forward!")
}
}
class Car inherits Vehicle {//这个车辆子类,有一个从父类继承来的方法
wheels = 4
drive() { inherited: drive() output("Rolling on all ", wheels, " wheels!") }
}
class SpeedBoat inherits Vehicle {//这个游艇子类,定义了一个属性需要先接收来自父类的方法
engines = 2
ignition() { output("Turning on my ", engines, " engines.") }
pilot() { inherited: drive()
output("Speeding through the water with ease!") }
}
问题:最后一个子类中的pilot() 方法继承的这个方法drive()需要调用一个方法ignition() ,而这个方法在父类Vehicle和子类SpeedBoat中都有,用的是哪一个呢?
答:如果在这个SpeedBoat子类的实例中调用,那么使用的就是这个子类中的 ignition() 方法,如果直接实例化那个父类,那么使用的就是父类中的 ignition() 方法 。这里的调用逻辑类似于原型链,需要先在自身上找有没有这个方法,如果没有的话就到父类上找。
super
在子类(而不是它们创建的实例对象!)中,子类也可以相对引用它继承的父类,这种相对引用通常被称为 super。
图中的Foo代表父类,Bar代表子类,而旁边是它们的实例,在Bar类中可以通过(super)访问父类中的方法,注意:子类得到的仅仅是继承自父类行为的一份副本,在子类中重写的方法并不会影响父类中原有的方法(类的继承其实就是复制)。
在js中的实现方法:
这里书的作者称其为混入:
function mixin( sourceObj, targetObj )
{ for (var key in sourceObj) {
// 只会在不存在这些属性的的情况下复制,两个循环语句将sourceObj里目标对象没有的属性赋给它,而对于子类重写了的方法则不覆盖
if (!(key in targetObj)) {
targetObj[key] = sourceObj[key];
} }
return targetObj; }
var Vehicle = {
engines: 1,
ignition: function() { console.log( "Turning on my engine." ); },
drive: function() { this.ignition(); console.log( "Steering and moving forward!" ); } };
var Car = mixin(
Vehicle, { wheels: 4,
drive: function() {
Vehicle.drive.call( this );
console.log( "Rolling on all " + this.wheels + " wheels!" );
} } );
这种复制方法复制的是引用类型的引用和基本类型的值,所以其实 ignition 属性两个对象调用的是内存中的同一个函数。
下次学习过程中有机会再更新。