动态语言类型与鸭子类型

此内容取自JavaScript设计模式与开发实践一书

编程语言按照数据类型大体可以分为2类,一类就是静态类型语言,另一类则是动态类型语言

静态类型语言也可以称之为编译语言,而动态类型语言则称可以之为解释型语言

JavaScript则属于动态类型语言他无需定义时候声明类型给实际编码带来了极大的灵活性,且可以尝试调用任何对象的任意方法,

而无需考虑它原本是否被设计为拥有该方法。

这其实也叫做鸭子类型 鸭子类型的定义为:如果它走起来像鸭子,叫起来也像鸭子,那么它就是鸭子

举个小例子:

  在一个动物王国中,国王觉得鸭子的声音是最美妙的,于是他要建立一个有2000个鸭子的合唱团,但是大臣们找遍了王国

却只能找到1999只鸭子始终是缺一只,最后一个大臣发现了一只特别的鸡,它的叫声和鸭子一模一样,于是这只鸡进入了合唱团

这个故事想要表达的意思是,国王要听的是鸭子的声音,但是这个声音的主人是鸭子还是鸡并不重要,哪怕它是条狗

下面上代码模拟一下这个故事:

 

 let duck = {
duckSinging(){
console.log('嘎嘎嘎');
}
};
let chicken = {
duckSinging(){
console.log('嘎嘎嘎');
}
}
let choir = [] //合唱团
let joinChoir = function(animal){
if(animal && Object.prototype.toString.call(animal.duckSinging) === '[object Function]'){
choir.push(animal);
console.log('欢迎加入合唱团');
console.log(`合唱团成员数量已有${choir.length}`);
}
}
joinChoir(duck);
joinChoir(chicken);

输出:

在动态类型语言的面向对象设计中,鸭子类型概念至关重要,利用鸭子类型的思想,我们不比借用超类型就能轻松实现动态语言

中的一个原则:“面向接口编程” 而不是面向实现编程

列如:一个对象若有push和pop方法并且正确实现,那么它就能当做栈来使用,如果有length属性,也可以依照下标来取值这个对象就能当做数组使用

“面向接口编程”是设计模式中最重要是思想

最新文章

  1. Mysql连接到Visual studio注意
  2. shell的if判断
  3. linux命令:ln
  4. SQL行转列汇总
  5. Away3D 的实体收集器流程1
  6. Windows环境下安装IPython NoteBook
  7. request.ServerVariables获取环境变量
  8. arm linux上的第一个应用程序 BOA移植
  9. sqlserver 存储过程学习笔记(二) 在项目中的应用<多表分页>
  10. js 检测浏览器
  11. Quartus FFT IP核简介
  12. Elasticsearch短语搜索——match_phrase
  13. 三、activiti工作流-流程设计工具
  14. 常用工具类(System,Runtime,Date,Calendar,Math)
  15. linux报错汇总
  16. java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量?
  17. JAR(Spring Boot)应用的后台运行配置
  18. 微信小程序初见+nodejs服务端 (一个简单的博客)
  19. VGA图像显示组成模块分析
  20. MySQL与OLAP:分析型SQL查询最佳实践探索

热门文章

  1. linux C之access函数(转载)
  2. E20180408-hm
  3. pojcoin【未完待续】
  4. POJ3186【区间DP】
  5. python 字符串函数功能快查
  6. eclipse中alt+/的作用
  7. Educational Codeforces Round 24 E
  8. 金蝶Apusic中间件适配JetSpeed2过程记录
  9. PopupWindow(2)简单示例-自定义弹出菜单
  10. port 22: Connection refused