应用场景:流程控制
好处:去掉冗余的条件判断
通过实例来说明:
不使用Duck Typing:
function bird(){
this.name="bird";
}
function duck(){
this.name="duck";
}
const type=(animal)=>{
if(animal instanceof bird){
console.log("I am a bird");
}else if(animal instanceof duck){
console.log("I am a duck");
}
}
var b=new bird();
var d=new duck();
type(b);
type(d);
使用Duck Typing:
var bird={
name:'bird',
speak:function(){
console.log("I am a "+this.name);
}
}
var duck={
name:"duck",
speak:function(){
console.log("I am a "+this.name);
}
}
const type=(animal)=>{
if(typeof animal.speak == "function"){
animal.speak();
return true;
}
return false;
}
type(bird);
type(duck);
可以很清楚的看到,使用Duck Typing减少了conditions判断,你只需要有speak方法,那就speak,我不需要判断你的类型。
If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.
上述就是Duck Typing的真谛!
使用条件:事先知道要处理对象的方法
总结:简单来说,就是把条件判断中后的方法,添加到对应处理对象中去,对使用者来说,只需要调用方法名即可。
可以参考java中面向接口的编程,定义一个接口;接口相当于定义了接口的一个规范,每一个继承的类都需要重写这个方法,防止出现别的方法名。
interface speak{
void speak();
}
所有的方法都使用这个
public bird implements speak{
public void speak(){
System.out.println("This is a bird!");
}
}
但是在Javascript中没有接口的说法,可以采用类似Duck Typing的方式,实现类似的功能。