一段多态的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(); //animal是抽象的,传入谁,就谁的方法
};
//可变部分各自封装起来
var Duck = function(){};
Duck.prototype.sound = function(){
console.log( '嘎嘎嘎' ); //鸭子的多态方法
};
var Chicken = function(){};
Chicken.prototype.sound = function(){
console.log( '咯咯咯' ); //公鸡的多态方法
};
makeSound( new Duck() ); // 嘎嘎嘎
makeSound( new Chicken() ); // 咯咯咯
//动物群里有好多种,大黄狗说我也要叫,于是就建立把,其他的动物都一样
var Dog = function(){};
Dog.prototype.sound = function(){
console.log( '汪汪汪' ); //大黄狗的多态逻辑
};
makeSound( new Dog() ); // 汪汪汪
Javascript 作为动态性语言,变量类型在运行中是可以改变的。一个JS对象。既可以表示鸭子对象类型,又可以表示公鸡类型。
在makeSound函数中既可以传递duck对象,又可以传递chkicken对象。
多态最根本的作用就是通过对象的多态性把条件分支语句消除。
将行为分布在各个对象中,让这些对象各自负责自己的行为。