理解对象
面向对象和面向过程
- 面向过程是分析出解决问题所需要的步骤,然后用函数把步骤一步一步实现,使用时一个一个依次调用就可以了。
- 面向对象是把构成问题事务分解为各个对象,建立对象的目的是为了描述某个事物在整个解决问题的步骤中的行为。
概念(我讲得通俗一点)
类:js中没有类的概念,取了一个新的名字—原型对象
原型对象:把猫(人、狗…)的特性提取出来,形成猫类(人类、狗类…),这个即为原型对象,代表着一类事物
对象(实例):猫类(人类、狗类…)中的A猫(A人、A狗…),即为对象实例,代表一个具体事物
对象的属性类型
一般为基本数据类型,也可以是另外的对象
小结
- 在js中一切都是对象
- 原型对象其实也是对象
- 判断一个对象实例具体是什么类型用instanceof运算符
(引用类型中有详讲) - 面向对象三大要素:封装、继承、多态。
创建对象
工厂模式(最古老)
1 | 这是一个能够根据接受的参数来构建一个包含所有必要信息的对象的函数 |
构造函数模式
1 | function Person(name,age){ |
原型模式
1 | function Person(){ } |
小结:
- 属性的查找是先从实例中找,实例中没有该属性,便从原型中找
- 数组friend添加了一个项,是先从person1中找数组修改,由于没找到,所以顺着原型链找到原型中的数组并修改了
- 实例对象的proto指向,其构造函数的原型。构造函数的prototype获得构造函数的原型。构造函数原型的constructor指向对应的构造函数
组合使用构造函数模式和原型模式(最佳)
构造函数模式定义实例属性
原型模式定义方法和原型属性
1 | function Person(name,age){ |
动态原型模式
1 | function Person(name,age){ |
寄生构造函数模式(工厂模式+构造函数模式)
1 | function Person(name,age){ |
稳妥构造函数模式
1 | function Person(name,age){ |
继承
原型链继承
1 | function Super(){ |
小结:
- 重写方法或添加新方法需写在继承后
- 属性查找是先从对象实例中找,没有就顺着原型链继续向上查找
- 创建子类实例时,无法向父类构造函数传参
- 父类方法和属性得到复用,子类实例没有自己的属性
借用构造函数继承
1 | function Super(val){ |
小结:
子类的每个实例都有自己的属性、方法,不会相互影响,但是占用内存。
组合继承(最常用)
原型链:对原型属性和方法的继承
借用构造函数:对实例属性的继承
1 | function Super(val){ |
小结:
- 复用了方法,子类又有各自的属性。
- 因为父类构造函数被执行了两次,子类的原型对象(Sub.prototype)中也有一份父类的实例属性,而且这些属性会被子类实例的属性覆盖掉,也存在内存浪费。
原型式继承(类似于对象复制)
创建新对象–>返回该对象–>增强(添加属性/方法)
1 | // 生孩子函数 beget:龙beget龙,凤beget凤 |
寄生式继承
创建新对象–>增强–>返回该对象
1 | // 生孩子函数 beget:龙beget龙,凤beget凤。 |
寄生组合式继承(最佳,但组合继承最常用)
有缺陷的寄生式继承+不完美的组合继承
1 | // 生孩子函数 beget:龙beget龙,凤beget凤 |
大总结:加油!棒棒哒!熬过这一章其余就轻松啦啦啦!已经写得尽可能详细了,多多复习!
ES6
创建对象
1 | class father { |
继承
1 | class son extends father { |
单词不要拼错:constructor