首页 > 代码库 > JavaScript设计模式与开发实践---读书笔记(1)
JavaScript设计模式与开发实践---读书笔记(1)
前言
设计模式的定义是:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。
从某些角度来看,设计模式确实有可能带来代码量的增加,或许会把系统的逻辑搞的更复杂。但软件开发的成本并非全部在开发阶段,设计模式的作用是让人们写出可复用和可维护性高的程序。
所有设计模式的实现都遵循一条原则,即“找出程序中变化的地方,并将变化封装起来”。
不变和稳定的部分是非常容易复用的。
分辨模式的关键是意图而不是结构
模式只有放在具体的环境下才有意义,辨别模式的关键是这个模式出现的场景,以及为我们解决的问题。
基础知识
Javascript通过原型委托的方式来实现对象与对象之间的继承。
JavaScript是一门典型的动态类型语言。动态类型语言对变量类型的宽容给实际编码带来了很大的灵活性。
鸭子类型指导我们关注对象的行为,而不关注对象本身,也就是关注HAS-A,而不是IS-A。
动态类型语言中实现的一个原则:"面向接口编程,而不是面向实现编程"。
"面向接口编程"是设计模式中最重要的思想,但在JavaScript语言中,"面向接口编程"的过程跟主流的静态语言不一样。
多态
多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。换句话说,给不同的对象发送同一个消息,这些对象会根据这个消息分别给出不同的反馈。
多态背后的思想是将"做什么"和"谁去做以及怎么去做"分离开来,也就是将"不变的事物"与"可能改变的事物"分离开来。
把不变的部分隔离出来,把可变的部分封装起来,这给予了我们扩展程序的能力,程序看起来是可生长的,也是符合开放-封闭原则的,相对于修改代码来说,仅仅增加代码就能完成同样的功能,这显然优雅和安全得多。
对象的多态性
类型检查和多态
使用继承得到多态效果
使用继承得到多态效果,是让对象表现出多态性的最常用手段。继承通常包括实现继承和接口继承。
多态的思想实际上是把"做什么"和"谁去做"分离开来,要实现这一点,归根结底先要消除类型之间的耦合关系。
多态最根本的作用就是通过把过程化的条件分支语句转化为对象的多态性,从而消除这些条件分支语句。
将行为分布在各个对象中,并让这些对象各自负责各自的行为,这正是面向对象设计的优点。
封装
封装的目的是将信息隐藏。
JavaScript中,一般我们只能依赖变量的作用域来实现封转特性,而且只能模拟出public和private这两种封装性。
除了ES6的let之外,一般我们通过函数来创建作用域。
封转实现
封转不仅仅是隐藏数据,还包括隐藏实现细节、设计细节以及隐藏对象的类型等。
对象之间仅仅通过暴露的API接口来通信。
原型模式
原型模式不单是一种设计模式,也被称为一种编程泛型。
使用克隆的原型模式
如果使用原型模式,我们只需要调用负责克隆的方法,便能完成同样的功能。
ES5提供了Object.create方法,可以用来克隆对象。
克隆是创建对象的手段
提供了一种便捷的方式去创建某个类型的对象,克隆只是创建这个对象的过程和手段。它的对象系统就是使用原型模式来搭建的,在这里称之为原型编程范型也许更合适。
JavaScript就是使用原型模式来搭建整个面向对象系统的。
基于原型链的委托机制就是原型继承的本质。
原型编程范型至少包括以下基本原则:
- 所有的数据都是对象。
- 要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它。
- 对象会记住它的原型。
- 如果对象无法响应某个请求,它会把这个请求委托给它自己的原型。
JavaScript中的原型继承
1.所有的数据都是对象
JavaScript设计者的本意,除了undefined之外,一切都应是对象。
这些对象追根溯源都来源于这个根对象。
JavaScript中的根对象是Object.prototype对象。Object.prototype对象是一个空的对象。我们在JavaScript遇到的每个对象,实际上都是从Object.pototype对象克隆而来的,Object.prototype对象就是它们的原型。
2.要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它
JavaScript的函数既可以作为普通函数被调用,也可以作为构造器被调用。当使用new运算符来调用函数时,此时的函数就是一个构造器。
3.对象会记住它的原型
JavaScript给对象提供了一个名为_proto_的隐藏属性,某个对象的_proto_属性默认会指向它的构造器的原型对象,即{constructor}.prototype
_proto_就是对象跟"对象构造器的原型"联系起来的纽带。
4.如果对象无法响应请求,它会把这个请求委托给它的构造器的原型
对象构造器的原型并不仅限于Object.prototype上,而是可以动态指向其他对象。
原型模式是一种设计模式,也是一种编程泛型,它构成了JavaScript这门语言的根本。
JavaScript设计模式与开发实践---读书笔记(1)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。