06-继承(原型和原型链)

76 阅读4分钟

1.问题:

​ 只要将方法定义放在构造函数中,那么,每次new时都会执行function,就会反复创建相同函数的多个副本!——浪费内存

2.解决:

​ 如果将来发现多个子对象都要使用相同的功能和属性值时,都可以用继承来解决

3.什么是继承:

​ 父对象中的成员,子对象无需重复创建,就可直接使用!就像使用自己的成员一样!

如何: js中的继承都是通过原型对象实现的

4.如何

4.1什么是原型对象:

​ 替所有子对象集中保存共有属性值和方法的特殊父对象.

4.2 何时:

​ 今后,只要发现多个子对象,都需要使用相同的功能和属性值时,都可将相同的功能和属性值集中定义在原型对象中。

4.3如何:

4.3.1如何创建原型对象:

​ 不用自己创建。而是在定义构造函数时,程序自动附赠我们一个空的原型对象

4.3.2如何找到原型对象:

​ 构造函数中都有一个自带的属性prototype,指向自己配对的原型对象。

构造函数.prototype

4.3.3何时如何继承:

new的第二步自动让新创建的子对象,继承构造函数的原型对象。

new会自动为子对象添加_ proto _属性,指向构造函数的原型对象。

原型.jpg

4.3.4如何向原型对象中添加新的共有属性和方法:

只能强行赋值:

构造函数.prototype.共有方法=function(){ ... }

构造函数.prototype.共有属性=属性值

原型2.jpg

4.4结果:

​ 今后,用子对象.访问对象的成员时,js引擎先在子对象内部查找自有的属性。如果子对象没有,则js引擎会自动延_ proto _属性去父元素查找。如果在父元素中找到了想要的属性或方法,则和访问子对象的方法一样调用。

4.5强调:

​ 所以,今后,构造函数中一定不要包含方法的定义。所有方法都应该集中定义到原型对象中一份。所有子对象共用。

5.自有属性和共有属性:

5.1自有属性:

​ 保存在子对象内部,只归当前子对象自有的属性

5.2 共有属性:

​ 保存在父对象(原型对象)中,归多个子对象共有的属性

5.3获取属性值时,毫无差别,都可用: 子对象.属性名

如果js引擎发现,要使用的属性不在子对象中,则自动延_ proto _属性向父对象继续查找要用属性。

5.4修改属性值时:

自有属性: 子对象.属性名=属性值;

共有属性:

错误: 子对象.共有属性=新值

后果: 不但不会修改原型对象中的共有属性,而且还会给当前子对象添加一个同名的自有属性。从此,这个子对象,在这个属性的使用上,与其他子对象,再无法保持同步!

原型3.jpg

正确: 共有属性,必须用原型对象修改:

构造函数.prototype.共有属性=新值

6.内置类型的原型对象:

6.1什么是内置类型:

ES标准中规定的,浏览器已经实现,我们可以直接使用的类型。

6.2包括: 11种:

String, Number, Boolean

Array, Date, RegExp, Math(不是类型,已经是一个{}对象)

Error

Function Object

global(全局作用域对象,在浏览器中被window代替)

6.3什么是类型:

每种类型一定有2部分组成:

1.构造函数: 负责创建该类型的子对象

2.原型对象: 负责为该类型所有子对象集中保存共有的属性值和方法定义。

内置对象.jpg

6.4

其实11种内置类型中的九种类型,也都由**构造函数和原型对象组成。**也都可以new创建子对象。

6.5

今后,只要想知道新标准的ES中新增了哪些函数,都可看这个类型的原型对象。

6.6问题:

如果经常使用的一个功能,但是原型对象中没有提供!

6.7 解决:

其实,我们可以自定义一个函数,保存到原型对象中。

构造函数.prototype.新方法=function(){...}

内置对象3.jpg

内置对象4.jpg

内置对象2.jpg

所以普通for循环只用来遍历数字下标的索引数组和类数组对象

for in循环专门用于遍历非数字下标的关联数组对象

7.原型链:

7.1什么是:

原型链.jpg

​ 由多级父对象逐级继承形成的链式结构!

7.2保存着:

​ 一个对象可用的所有属性和方法

7.3控制着:

​ 属性和方法的使用顺序: 就近原则: 先子级后父级