第1章 面向对象的JavaScript

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

P4 静态类型语言如Java很难面向接口编程,需向上转型、抽象类、接口interface

1.2 多态

1.2.1 一段多态的JavaScript代码

p5 “做什么”和“谁去做以及怎样去做”分离开

1.2.2 对象的多态性

鸭叫、鸡叫 + 狗叫

1.2.3 类型检查和多态

P7 向上转型

当给一个类变量赋值时,这个变量的类型既可以使用这个类本身,也可以使用这个类的超类。

通过使用超类(抽象类或接口),把对象真正类型隐藏在超类型之后,这些对象才能在类型检查时被互相替换使用而不报错。

多态性的表现是实现众多设计模式的目标

1.2.4 使用继承得到多态效果

能满足类型检查
鸭叫、鸡叫 + 狗叫 — 动物叫

1.2.5 JavaScript的多态

多态性与生俱来,不需要向上转型

1.2.6 多态在面向对象程序设计中的作用

P9 消除条件分支,只管调用行为

1.2.7 设计模式与多态

函数用来封装行为并且能够被四处传递 (我理解为:函数作为参数传递)

1.3 封装

1.3.1 封装数据

函数创建作用域

1.3.2 封装实现

封装内部实现,暴露API接口

1.3.3 封装类型

静态语言通过抽象类和接口封装类型

1.3.4 封装变化

设计模式的角度,最重要的是封装变化。
把系统中稳定不变的部分和容易变化的部分隔离开

1.4 原型模式和基于原型继承的JavaScript对象系统

1.4.1 使用克隆的原型模式

  1. Object.create

1.4.2 克隆是创建对象的手段

静态语言:使用依赖倒置,创建对象时避免依赖具体类型
JavaScript:不存在类型耦合。可称为原型编程范型。

1.4.3 体验Io语言

了解

1.4.4 原型编程范型的一些规则

其实就是JavaScript的原型链

1.4.5 JavaScript的原型继承

  • new运算符创建对象的过程
  • 原型对象的原型(prototype)其实是指构造器的原型
  • 实例的proto隐藏属性指向原型的prototype
  • 创建对象时JavaScript引擎做的事情:沿原型链(包括实例、prototye)向上查找属性/方法
  • ES5的继承
  • Object.prototype的原型是null

    1.4.6 原型继承的未来

  • Object.create是原型模式的天然实现,但效率不高

  • Object.create(null)可创建没有原型的对象
  • ES6的class看上去像是类,其背后仍是原型机制来创建对象