Javascript中的Duck Typing

应用场景:流程控制
好处:去掉冗余的条件判断
通过实例来说明:
不使用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的方式,实现类似的功能。

你可能感兴趣的:(Javascript)