javascript面向对象之“多态”

Dansha的花果山 2019-06-29

ES6之前,javascript本质上不能算是一门面向对象的编程语言,因为它对于封装、继承、多态这些面向对象语言的特点并没有在语言层面上提供原生的支持。
但是,它引入了原型(prototype)的概念,可以让我们以另一种方式模仿类,并通过原型链的方式实现了父类子类之间共享属性的继承以及身份确认机制。
其实,面向对象的概念本质上来讲不是指某种语言特性,而是一种设计思想。
正是由于javascript本身对面向对象编程没有一个语言上的支持标准,所以才有了五花八门、令人眼花缭乱的“类继承”的代码。
所以在ES6中出现了class extends等关键字,解决了javascript面向对象中出现了问题。
之前花了大量篇幅来讲述面向对象中的封装和继承
谈一谈javascript面向对象
javascript面向对象与原型
javascript 面向对象之一篇文章搞定call()方法")
javascript面向对象之继承(上)")
javascript面向对象之继承(下)")
javascript面向对象之ES6中的类和继承
今天我们研究一下javascript面向对象中的多态

javascript 多态

如果你在搜索引擎中搜索javascript多态,有那么一个栗子你一定会搜到
非多态代码示例

var makeSound = function( animal ){
    if ( animal instanceof Duck ){
        console.log( '嘎嘎嘎' );
    }else if ( animal instanceof Chicken ){
        console.log( '咯咯咯' );
    }
};

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

makeSound( new Duck() ); // 嘎嘎嘎
makeSound( new Chicken() ); // 咯咯咯

多态的代码示例

var makeSound = function(animal) {
    animal.sound();
}

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

makeSound(new Chicken());
makeSound(new Duck());

这个栗子出自《JavaScript设计模式与开发实践》,我手里没有这本书,但是不耽误我们去研究,这个

相关推荐