面向对象的JavaScript

​ 学过JavaScript的人都知道,JavaScript是通过原型委托的方式来实现对象和对象之间的继承,和传统面向对象编程语言(例如Java、C++)的类继承有一些区别。所以我们在写面向对象的JavaScript的时候,需要注意一些关键点。

01 动态类型和鸭子类型

​ 编程语言可以分为动态类型语言静态类型语言,JavaScript就是动态类型语言,也可以说成弱类型语言。静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时候,待变量被赋予某个值之后,才会具有某种类型。

静态类型语言的优点:在编译时就能发现类型不匹配的错误,编辑器可以帮助我们提前避免程序在运行期间有可能发生的一些错误。其次,如果在程序中明确地规定了数据类型,编译器还可以针对这些信息对程序进行一些优化工作,提高程序执行速度。

静态类型语言的缺点:迫使程序员依照强契约来编写程序,为每个变量规定数据类型,归根结底**只是辅助我们编写可靠性高程序的一种手段,而不是编写程序的目的,毕竟大部分人编写程序的目的是为了完成需求交付生产。**其次,类型的声明也会增加更多的代码,在程序编写过程中,这些细节会让程序员的精力从思考业务逻辑上分散开来。

动态类型语言的优点:编写的代码数量更少,看起来也更加简洁,程序员可以把精力更多地放在业务逻辑上面。虽然不区分类型在某些情况下会让程序变得难以理解,但整体而言,代码量越少,越专注于逻辑表达,对阅读程序是越有帮助的。

动态类型语言的缺点:无法保证变量的类型,从而在程序的运行期有可能发生跟类型相关的错误。这好像在商店买了一包牛肉辣条,但是要真正吃到嘴里才知道是不是牛肉味。

在 JavaScript 中,当我们对一个变量赋值时,显然不需要考虑它的类型,因此,JavaScript是一门典型的动态类型语言。

动态类型语言对变量类型的宽容给实际编码带来了很大的灵活性。由于无需进行类型检测,我们可以尝试调用任何对象的任意方法,而无需去考虑它原本是否被设计为拥有该方法。

这一切都建立在鸭子类型(duck typing)的概念上,鸭子类型的通俗说法是:“如果它走起路来像鸭子,叫起来也是鸭子,那么它就是鸭子。”

小故事:

​ 从前在 JavaScript 王国里,有一个国王,他觉得世界上最美妙的声音就是鸭子的叫声,于是国王召集大臣,要组建一个 1000 只鸭子组成的合唱团。大臣们找遍了全国,终于找到 999 只鸭子,但是始终还差一只,最后大臣发现有一只非常特别的鸡,它的叫声跟鸭子一模一样,于是这只鸡就成为了合唱团的最后一员。

​ 这个故事告诉我们,国王要听的只是鸭子的叫声,这个声音的主人到底是鸡还是鸭并不重要。鸭子类型指导我们只关注对象的行为,而不关注对象本身,也就是关注 HAS-A, 而不是 IS-A。

代码奉上:

let duck = { duckSinging: function(){ console.log( '嘎嘎嘎' ); }
};
let chicken = { duckSinging: function(){ console.log( '嘎嘎嘎' );}
};
let choir = []; // 合唱团
let joinChoir = function( animal ){ if ( animal && typeof animal.duckSinging === 'function' ){ choir.push( animal ); console.log( '恭喜加入合唱团' ); console.log( '合唱团已有成员数量:' + choir.length ); }
};
joinChoir( duck ); // 恭喜加入合唱团
joinChoir( chicken ); // 恭喜加入合唱团

​ 我们看到,对于加入合唱团的动物,大臣们根本无需检查它们的类型,而是只需要保证它们拥有 duckSinging 方法。如果下次期望加入合唱团的是一只小狗,而这只小狗刚好也会鸭子叫,我相信这只小狗也能顺利加入。

​ 在动态类型语言的面向对象设计中,鸭子类型的概念至关重要。利用鸭子类型的思想,我们不必借助超类型的帮助,就能轻松地在动态类型语言中实现一个原则:“面向接口编程,而不是面向实现编程”。例如,一个对象若有 push 和 pop 方法,并且这些方法提供了正确的实现,它就可以被当作栈来使用。一个对象如果有 length 属性,也可以依照下标来存取属性(最好还要拥有 slice 和 splice 等方法),这个对象就可以被当作数组来使用。

​ 在静态类型语言中,要实现“面向接口编程”并不是一件容易的事情,往往要通过抽象类或者接口等将对象进行向上转型。当对象的真正类型被隐藏在它的超类型身后,这些对象才能在类型检查系统的“监视”之下互相被替换使用。只有当对象能够被互相替换使用,才能体现出对象多态性的价值。

​ “面向接口编程”是设计模式中最重要的思想,但在 JavaScript 语言中,“面向接口编程”的过程跟主流的静态类型语言不一样,因此,在 JavaScript 中实现设计模式的过程与在一些我们熟悉的语言中实现的过程会大相径庭。

动态类型语言和鸭子类型相关推荐

  1. python鸭制作类代码_Python动态语言与鸭子类型详解

    今天来说说编程语言中的动态类型语言与鸭子类型. 动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其 ...

  2. go语言设计理念——鸭子类型

    一.鸭子类型 符合golang设计理念的鸭子类型 1.设计 package consulimport ("fmt""github.com/hashicorp/consul ...

  3. python鸭子类型_关于鸭子类型

    其实对我来说鸭子类型一直是一个比较模糊的概念,因为平常不去关注,关注的时候一般是在面试或者被面试的时候,今天在看一篇博客的时候又有看到,所以就索性弄清楚 ``` 首先 与duck typing相对应的 ...

  4. python鸭子类型_Python的鸭子类型

    '那只东西呱呱的叫,有扁扁的嘴巴,走起路来还外八,对!它就是只鸭子'基本定义 对于熟悉python的开发者来说,相信对于python的鸭子类型比较熟悉,所谓鸭子类型,在维基百科中的准确定义是'是动态类 ...

  5. ts中类型检测的鸭子类型是什么意思

    "鸭子类型" 是一种编程概念,在 TypeScript 中也适用.它指的是一种类型的判定方式,是看它是否具有某些必要的属性或方法,而不是看它是否属于某个具体的类. 举个例子,假设我 ...

  6. 最简洁的解释动态语言中的鸭子类型和闭包

    常见定义 闭包 是拥有独立变量(在封闭空间中定义的可以在本地环境中使用的变量)的函数 程序语言中的闭包(closure)概念不是由JavaScript最先提出的,从smalltalk开始,闭包就成了编 ...

  7. Python 语言中的 “鸭子类型”

    Python 语言中的 "鸭子类型" 继承 多态 鸭子类型 不要检查它是不是鸭子.它的叫声像不像鸭子.它的走路姿势像不像鸭子,等等.具体检查什么取决于你想使用语言的哪些行为.(co ...

  8. python与鸭子类型

    目录 1.面向对象(OOP)的三大特征 2.静态类型语言和动态类型语言的区别 3.面向接口编程 4.鸭子类型 5.python中的多态 1.面向对象(OOP)的三大特征 (1)面向对象程序设计有三大特 ...

  9. duck typing java_编程语言中的鸭子类型 Duck Typing

    来源 | https://segmentfault.com/a/1190000019607240 1.什么是鸭子类型(duck typing) 百度百科是这样解释的: 这是程序设计中的一种类型推断风格 ...

最新文章

  1. MDK_main()代码执行过程分析
  2. Hibernate学习(二):heibernate核心接口
  3. IDEA中SVN未提交代码,更新时有冲突接受其它怎么办
  4. python matplotlib画折线图出现连线混乱_python使用matplotlib模块绘制多条折线图、散点图...
  5. 07 | 链表(下):如何轻松写出正确的链表代码?
  6. js计算排名_今天,我们讲一下,快速排名与黑帽SEO
  7. 【BZOJ4034】T2,树链剖分练习
  8. 获取Python安装目录
  9. spark笔记之Scala中的协变、逆变、非变
  10. webpack官方文档分析(一):安装
  11. 【php基础入门】细说php的变量以及常量的知识点详解
  12. 本特利电源模块3500/15-05-05-00
  13. 六、鼎捷T100生产管理之生产入库管理篇
  14. RGB颜色转16进制颜色
  15. 谈一谈CloudBlog的系统架构
  16. crc16的c语言函数 计算ccitt_CRC16-CCITT 的算法
  17. Android 根据心电图(ECG)数据绘制心电图
  18. Python numpy.mat函数方法的使用
  19. 【商业数据分析】CPC广告投放系统的要素介绍
  20. 李航《统计学习方法》读书笔记(1):朴素贝叶斯分类

热门文章

  1. MySQL导入大批Excel数据
  2. 10元买啤酒问题Java递归
  3. 1DCNN添加Residual Block, python代码实现及讲解
  4. python发送QQ邮件报错:ssl.SSLError: [SSL: WRONG_VERSION_NUMBER]和smtplib.SMTPAuthenticationError(已解决)
  5. Mac-VMwareFusion固定IP、网段
  6. Scope Is the Enemy of Success
  7. 直播软件开发互动直播之WebRTC服务开源技术选型
  8. 十大热销HR软件实施优势和风险比较
  9. python语言的编程模式是什么意思_关于 Python 语言的编程模式,哪个说法正确?_学小易找答案...
  10. 光鲜的背后总是黑暗相伴