JavaScript设计模式基础之面向对象的JavaScript(一)
动态语言类型与鸭子类型
此内容取自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属性,也可以依照下标来取值这个对象就能当做数组使用
“面向接口编程”是设计模式中最重要是思想
JavaScript设计模式基础之面向对象的JavaScript(一)的更多相关文章
- JavaScript设计模式基础之面向对象的JavaScript(二)
多态 多态的实际含义:同一操作作用与不同的对象上面,可以产生不同的解释和不同的执行结果,就是说,给不同的对象发送同一个消息 的时候,这些对象会根据这个消息分别给出不同的反馈 代码如下: class D ...
- JavaScript设计模式基础(二)
JavaScript 设计模式基础(一) 原型模式 在以类为中心的面向对象编程语言中,类和对象的关系就像铸模和铸件的关系,对象总是从类中创建.而原型编程中,类不是必须的,对象未必从类中创建而来,可以拷 ...
- JavaScript设计模式基础(一)
模式的起源 模式 起源于建筑学.20世纪70年代,哈佛大学建筑学博士Christopher Alexander和他的团队花大约20年,来研究为解决同一个问题而设计出的不同建筑结构,从中发现那些高质量设 ...
- javascript设计模式 第一章 灵活的javascript
javascript 设计模式 第1章 灵活的语言--JavaScript 初级程序员接到一个验证表单功能的任务,需要验证用户名.邮箱.密码等 ** 此文章内容大部分来自 <javascript ...
- JavaScript设计模式基础之闭包(终)
对于前端程序员来说闭包还是比较难以理解的, 闭包的形成与变量的作用域以及变量的生产周期密切相关,所以要先弄懂变量的作用域和生存周期. 1.变量作用域 变量的作用域,就是指变量的有效范围,通常我们指的作 ...
- JavaScript设计模式基础之this、call、apply
1.this的指向 除去不常用的with和eval,具体应用中this指向大概能分为4种情况分别是 1.作为对象的方法调用. 2.作为普通函数的方法调用. 3.Function.prototype.c ...
- Javascript设计模式笔记
Javascript是越来越厉害了,一统前后端开发.于是最近把设计模式又看了一遍,顺便做了个笔记,以方便自己和他人共同学习. 笔记连载详见:http://www.meteorcn.net/wordpr ...
- JavaScript设计模式学习之路——面向对象的思想
今天,我拿到了张容铭写的这本<JavaScript设计模式>这本书,开始了关于JavaScript更深一点的学习. 看到这本书开始的时候,虽然之前通过看书.一些比较好的视频的讲解,对Jav ...
- JavaScript设计模式经典-面向对象中六大原则
作者 | Jeskson来源 | 达达前端小酒馆 1 主要学习JavaScript中的六大原则.那么六大原则还记得是什么了吗?六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则( ...
随机推荐
- 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时1
课时1 计算机视觉历史回顾与介绍上 CS231n:这一一门关于计算机视觉的课程,基于一种专用的模型架构,叫做神经网络(更细一点说,是卷积神经网络CNN).计算机视觉是人工智能领域中发展最为迅猛的一个分 ...
- 简析hotjar录屏功能实现原理
简析hotjar录屏功能实现原理 众所周知,hotjar中录屏功能是其重要的一个卖点,看着很牛X酷炫的样子,今天就简单的分析一下其可能实现(这里只根据其请求加上个人理解分析,并不代表hotjar中真实 ...
- Cannot call value of non-function type 'UITextView'报错
iOS里面的开发,类写到一半就报错这个.后来发现是因为重名的时候召唤对象不明确的问题.先贴代码,晚点再说 出错点 //ヒントをクリアするためのイニシャライザ init (clearStr: UITex ...
- C++笔试题(三)
普天是南京一家通信公司,全称为:南京普天通信股份有限公司,公司网址为:http://www.postel.com.cn 网上流传一套普天C++笔试题,我将我做的答案公布与此,仅供参考. 1.实现双向链 ...
- Codeforces626C 【二分】
题意: 有两种搬砖的(不好好打代码就只能搬砖了),有n个sou弱的只能搬2块,m个stronger一点的能搬3块,他们想作死的独自把砖垒高,然后每个人垒的高度还各不相同,问你存在的最高高度的最小: 思 ...
- hdu1085 Holding Bin-Laden Captive!【生成函数】
列出生成函数的多项式之后暴力乘即可 #include<iostream> #include<cstdio> #include<cstring> using name ...
- 如何阻止浏览器的默认事件,你是否也遇到过无法阻止Google默认事件的情况( 原生JS )
如题,话不多话,我们先看怎么解决 根据不同的绑定事件的方法,我们有不同的阻止默认事件的方法 如果你不知到如何绑定事件,请查看我的上一篇文章 关于浏览器滚动的兼容性问题以及事件绑定 1.句柄绑定 只需要 ...
- (九)SpringBoot整合redis框架
二:添加Redis依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
- web.xml报错:Invalid content was found starting with element 'init-param'
问题与分析 在web.xml中配置servlet节点时报错如下: cvc-complex-type.2.4.a: Invalid content was found starting with ele ...
- 贪心 HDOJ 5090 Game with Pearls
题目传送门 /* 题意:给n, k,然后允许给某一个数加上k的正整数倍,当然可以不加, 问你是否可以把这n个数变成1,2,3,...,n, 可以就输出Jerry, 否则输出Tom. 贪心:保存可能变成 ...