JavaScript设计模式(1.1动态类型语言和鸭子类型)

283 阅读3分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

正文

大家好,我又来参加掘金的更文活动了,距离去年的更文活动已经过去了1个月了,实不相瞒,上次的更文活动我写的并不是很好,可能是新手的原因,所以这次活动我觉得认真对待,争取更满!!!

相信大家对设计模式多少都有一些了解,我是今天才开始看的书,一本叫做《JavaScript设计模式与开发实践》

我打算用这一本书每天进行更文挑战,当然不是抄袭书本,是结合自己看书的理解把书读薄。并写下笔记。

设计模式是什么

设计模式的定义:再面向对象软件设计的过程中针对特定问题的简洁而优雅的解决方案

说得通俗一点,设计模式就是给面向对象软件开发中的一些牛B的设计 “取个名字

打个比方,一个人爱好电子设备,他一直在家里自学,直到有一天他打算去学校深造,发挥自己的价值,然后在学校里学的知识他其实一直都再使用,学到了很多专业术语,虽然不知道其背后的原理,但实际上多年来他一直再使用,然后就是一个接着一个的顿悟。

其实设计模式大家一直都在使用,并不是发明出来的,而是GoF把这些好的设计从茫茫的优秀软件作品中挑选出来,并且给他们一个好的名字。

这就开始

1.1动态类型语言和鸭子类型

编程的语言一般分为两大类:动态类型,静态类型。

静态的优点是提前发现类型,但是缺点是迫使程序员依照某种契约去完成。动态的优缺点则和静态相反

在JavaScript中,在定义时显然不需要考虑它的类型,因此JavaScript是经典的动态类型语言

经典的鸭子类型:有一个故事讲的是一个国王十分喜欢鸭子的叫声,决定用1000只鸭子组成一个合唱团。但是最终找到了999只,大臣们最终发现了一只叫声很像鸭子的鸡,最后那只鸡成了合唱团的最后一员。

我们用代码解释一下这故事

var duck = {
		duckSinging: function(){
			console.log( '嘎嘎嘎' );
		}
	};

	var chicken = {
		duckSinging: function(){
			console.log( '嘎嘎嘎' );
		}
	};

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

	joinChoir( duck ); // 恭喜加入合唱团
	joinChoir( chicken ); // 恭喜加入合唱团

(如果一只狗也会鸭子叫那它肯定也可以加入合唱团)

总结

鸭子类型在设计模式的概念中至关重要,我们利用鸭子模型的思想就可以不借助超文本类型的帮助,就能在动态类型中语言中实现 “面向接口” 的。例如如果一个对象他拥有push方法,那它就可以被当作栈来使用,如果它拥有length方法,那它也可以利用下标来存取属性。