1.多态不是“神奇的效果(特性)”,而是在静态语言相对动态语言,类型不灵活体现
2.由上,在灵活的动态语言中,谈不上“多态”的概念。
例如在java中:
class Dog{
void bark(){}
}
class Jingba extend Dog{
void bark (){
System.out.println('wangwang');
}
}
class Hashiqi extend Dog{
void bark (){
System.out.println('wuwu');
}
}
// 某个方法,大致如下:
void call (Jingba j){//此处,j变量前,声明了j必须是Jingba类的实例
j->bark();
}
void call (Hashiqi h){//此处,h变量前,声明了h必须是Hashiqi类的实例
h->bark();
}
// 如上不够灵活,
void call(Dog d){//此处,声明必须是狗类的实例,所以传j,h都行
d->bark();
}
经过上面的改造,本来只能接受Jingba,Hashiqi实例的,
现在能接受的范围宽了,只要是Dog的实例或Dog子类的实例,都可以
同时,将导致一个后果:传一个Dog实例过来,
有可能是Hashiqi对象,wuwu叫
也可能是Jingba对象,wangwang叫
都是传Dog对象进来,有不同的叫声,称之为多态。
由上可知,js里谈不上多态,因为js就没有限制参数类型。
用JS实现多态
function Dog(){
this.leg = 4;
this.bark = null;
}
function Hashiqi(){
this.bark = function(){
alert('wangwang');
}
}
function Jingba(){
this.bark = function(){
alert('wuwu');
}
}
Hashiqi.prototype = Jingba.prototype = new Dog();
var h = new Hashiqi();
var j = new Jingba();
function test(dog){
dog.bark();
}
test(h);
test(j);
//传进来狗对象,叫声却不同,因为传的是狗的不同子类。