javascript设想形式与开辟实践(一)- 多态

PS:上一篇文章宣布以后,许多朋侪关注了本人的思否和掘金的博客,虽然关注的朋侪另有有限,但充足让我把自身在技术上的题目积聚分享给人人,也愿望人人能够喜好,同时能动一动手指,给一颗心(赞),博主会延续更新下去

多态

本文是《javascript设想形式与开辟实践》一书进修笔记,因书中所表述的观点简朴明了,故将整本书的笔记送上,悉数文章大概在20篇摆布,还请朋侪们延续关注

动态言语范例

编程言语根据数据范例大致能够分为两类,一类是静态范例言语,另一类是动态范例言语

静态范例言语,声明任何变量或许形参都须要指定范例,比方java言语。
动态范例言语,声明任何变量或许形参都不须要指定范例,javascript就是动态范例言语。

所谓动态,能够多层面的明白,起首,声明变量不须要指定范例,其次,在多态头脑下,java中须要应用父类完成多态,而javascript就不须要,自身自带多态属性。

多态

熟习java的朋侪晓得,java三大特性之一就有多态,多态给java带来了很大的灵活性,许多设想形式也是经由过程多态来完成,java中的多态涉及到向上转型和向下转型,而javascript(以下简称js)的”多态”就相对来讲轻易完成

我们来看一段“多态”的js代码

var makeSound = function(an) {
    if(an instanceof Duck) {
        console.log("嘎嘎嘎");
    } else if(an instanceof Dog) {
        console.log("汪汪汪");
    }
}

var Dog = function(){};
var Duck = function(){};

makeSound(new Dog());
makeSound(new Duck());

这段代码确切表现了“多态性”,当我们离别向鸭和鸡发出“叫嚷”的音讯时,它们根据此 音讯作出了各自差别的回响反映,然则如许写会有一个弊病,当更多的范例涌现时,我们要不停的修正makeSound函数,后期makeSound函数也会变得非常庞大,这不相符优越代码设想的范例,多态背地的头脑是将“做什么”和“谁去做以及如何去做”星散开来,也就是将“稳定的事 物”与 “能够转变的事物”星散开来。在这个故事中,动物都会叫,这是稳定的,然则差别类 型的动物详细怎样叫是可变的。把稳定的部份断绝出来,把可变的部份封装起来,这赋予了我们 扩大顺序的才能,顺序看起来是可发展的,也是相符开放—关闭准绳的,相对于修正代码来讲, 仅仅增添代码就可以完成一样的功用,这明显文雅和平安很多

起首,我们把makeSound函数修正一下:

var makeSound = function(an) {
    an.speak();
}

这段代码传入一个对象,然后挪用对象的speak函数

var Duck = function(){}
Duck.prototype.sound = function(){
    console.log( '嘎嘎嘎' );
};
var Chicken = function(){}
Chicken.prototype.sound = function(){
    console.log( '咯咯咯' );
};
makeSound( new Duck() ); // 嘎嘎嘎
makeSound( new Chicken() );

如今我们向鸭和鸡都发出“叫嚷”的音讯,它们接到音讯后离别作出了差别的回响反映。如果有 一天动物天下里又增添了一只狗,这时刻只需简朴地追加一些代码就可以够了,而不必修改之前的 makeSound 函数

范例搜检和多态

如今,我们来进一步相识多态,之前说到,java的多态须要应用继续来完成,我们如今把动物的例子换成java代码

public class Duck {
    public void speak(){
        System.out.println( "嘎嘎嘎" );
    }
}

public class Dog {
    public void speak(){
        System.out.println( "汪汪汪" );
    }
}

public class AnimalSpeak{
    public void makeSound(Duck duck){
        duck.speak();
    }
}

public static void main(String args[]){
    AnimalSpeak an = new AnimalSpeak();
    Duck duck = new Duck();
    an.makeSound(duck); // 输出:嘎嘎嘎
}

如今鸭子已顺遂叫出来了,然则我们想让狗也叫,发明不太轻易完成,由于makeSound函数中,形参是Duck范例,传入Dog范例一定会报错,这个时刻继续就涌现了,java设想思绪是我先建立一个父类,详细传入的范例由子类决议,然则makeSound函数中的形参确是父类范例,完成以下:

public abstract class Animal{
    abstract void speak(); // 笼统要领
}

public class Duck extends Animal {
    public void speak(){ // 覆写父类中的笼统要领
        System.out.println( "嘎嘎嘎" );
    }
}

public class Dog extends Animal {
    public void speak(){ // 覆写父类中的笼统要领
        System.out.println( "汪汪汪" );
    }
}

public class AnimalSpeak{
    public void makeSound(Animal an){
        an.speak();
    }
}

public static void main(String args[]){
    AnimalSpeak an = new AnimalSpeak();
    Animal duck = new Duck();
    Animal dog = new Dog();
    an.makeSound(duck); // 输出:嘎嘎嘎
    an.makeSound(dog); // 输出:汪汪汪
}

js中的多态

JavaScript 对象的多态性是与生俱来的,为何这么说? 细致看看这两个函数:

public void makeSound(Animal an){
    an.speak();
}

function(an) {
    an.speak();
}

js和java中的函数的形参是差别的,java定死了传入的范例,而js是动态的,js随意能够传入任何范例,所以,我们之前说js是动态范例言语,在 JavaScript 这类将函数作为一等对象的言语中,函数自身也是对象,函数用来封装行动并 且能够被四周通报。当我们对一些函数发出“挪用”的音讯时,这些函数会返回差别的实行结 果,这是“多态性”的一种表现,也是许多设想形式在 JavaScript 中能够用高阶函数来替代完成的缘由。

    原文作者:jasonlive
    原文地址: https://segmentfault.com/a/1190000013510949
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞