多态和重载的区别
重载:重载可认为是静态的多态,静态联编,发生在编译阶段;
重载就是一组具有相同名字、不同参数列表的函数(方法)。
重载,函数特征之一,表现为在一个类中同名不同参的方法分别被调用会产生不同的结果。
多态:
多态是动态的,动态联编,发生在运行阶段;
多态,面向对象特征之一,表现为不同对象调用相同方法会产生不同的结果。可以理解一个方法被不同实现后 展现不同的效果及状态。
静态的比动态的效率高,但动态的最大优点是多态性,提高代码复用性。
js中实现重载
一、根据arguments个数实现重载
js本身不支持重载,所以只能通过其他方式实现,arguments检测传参的个数,然后再执行不同的方式
function add() {
var sum = 0 ;
for ( var i = 0 ; i < arguments.length; i ++ ) {
sum += arguments[i];
}
return sum;
}
alert(add());
alert(add( 1 , 2 ));
alert(add( 1 , 2 , 3 ));
function overLoading() {
// 根据arguments.length,对不同的值进行不同的操作
switch(arguments.length) {
case 0:
/*操作1的代码写在这里*/
break;
case 1:
/*操作2的代码写在这里*/
break;
case 2:
/*操作3的代码写在这里*/
//后面还有很多的case......
}
}
二、检测数据类型实现重载
根据传参的类型,调用不同的方法,用typeof进行检测
//检测数据类型实现重载 typeof
var MyClass=function(){
var AddNum=function(a,b){
return a+b;
}
var AddString=function(a,b){
return "I am here"+a+b;
}
this.Add=function(a,b){
if(typeof(a)=="number")
return AddNum(a,b);
else
return AddString(a,b);
}
}
function add(a,b){
return a+b;
}
function add(a,b){
return "I am here"+a+b;
}
var MyObj = new MyClass();
var X = MyObj.Add(5,6);
var Y = MyObj.Add("A","FFFFFF");
alert(X); //结果:11
alert(Y); //结果:I am hereAFFFFFF
三、jquery中的重载
如果传递2个参数表示获取值,传递三个参数表示赋值
function attr(id, key, value){
var dom = $$.$id(id);
var args = arguments.length;
if(args ===3 ){
dom.setAttribute(key, value);
}else{
return dom.getAttribute(key);
}
}
attr(1,2);
attr(1,2,3);
js中实现多态
非多态代码示例
var makeSound = function(animal) {
if(animal instanceof Duck) {
console.log('嘎嘎嘎');
} else if (animal instanceof Chicken) {
console.log('咯咯咯');
}
}
var Duck = function(){}
var Chiken = function() {};
makeSound(new Chicken());
makeSound(new Duck());
多态的代码示例
var makeSound = function(animal) {
animal.sound();
}
var Duck = function(){}
Duck.prototype.sound = function() {
console.log('嘎嘎嘎')
}
var Chiken = function() {};
Chiken.prototype.sound = function() {
console.log('咯咯咯')
}
makeSound(new Chicken());
makeSound(new Duck());