1. 原型
1. 1 原型介绍
- JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以称为原型对象
- 构造函数通过原型分配的函数是所有对象所共享的
- 原型对象可以挂载函数,对象实例化不会多次创建原型上函数,节约内存
- 把不变的方法,直接定义在 prototype 对象上,这样所有对象的实例就可以共享这些方法
1. 2 原型—this指向
- 构造函数和原型对象中的 this 都指向实例化的对象
2.constructor属性
2. 1 在哪里
- 每个原型对象里面都有个constructor属性
2. 2 作用
- 该属性指向该原型对象的构造函数,简单理解,就是指向我的爸爸,我是有爸爸的孩子
2. 3 使用场景
- 如果有多个对象的方法,我们可以给原型对象采取对象形式赋值
- 但是这样就会覆盖构造函数原型对象原来的内容,这样修改后的原型对象constructor 就不再指向当前构造函数了
- 此时,我们可以在修改后的原型对象中,添加一个 constructor 指向原来的构造函数
3.对象原型
3. 1 思考(引入)
- 构造函数可以创建实例对象,构造函数还有一个原型对象,一些公共的属性或者方法放到这个原型对象身上但是为啥实例对象可以访问原型对象里面的属性和方法呢?
3. 2 原型对象介绍
- 对象都会有一个属性__ proto __指向构造函数的 prototype 原型对象,之所以我们对象可以使用构造函数 prototype 原型对象的属性和方法,就是因为对象有__ proto __原型的存在
3. 3 注意
- __ proto __是 JS 非标准属性
- [[ prototype ]]和_ proto _意义相同
- 用来表明当前实例对象指向哪个原型对象 prototype
- __ proto __对象原型里面也有一个 constructor 属性,指向创建该实例对象的构造函数
4.原型继承
4. 1 介绍
- 继承是面向对象编程的一个特征,通过继承进一步提升代码封装的程度, JavaScript 中大多是借助原型对象实现继承的特性。
4. 2 实现
4.2.1. 封装-抽取公共部分
- 把男人和女人公共的部分抽取出来放到人类里面
4.2.2. 继承-让男人和女人都能继承人类的一些属性和方法
- 把男人女人公共的属性和方法抽取出来 People
- 然后赋值给 Man 的原型对象,可以共享这些属性和方法
- 注意让 constructor 指回 Man 这个构造函数
4.2.3. 问题-原因
- 问题:如果我们给男人添加了一个吸烟的方法,发现女人自动也添加这个方法
- 原因:男人和女人都同时使用了同一个对象,根据引用类型的特点,他们指向同一个对象,修改一个就会都影响
4.2.4. 解决
- 需求:男人和女人不要使用同一个对象,但是不同对象里面包含相同的属性和方法
- 答案:构造函数—new 每次都会创建一个新的对象