JavaScript学习笔记

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);
//传进来狗对象,叫声却不同,因为传的是狗的不同子类。