原型与继承
知识类型
1【难点】【级别要求:了解】对于原型方面的理解; - 了解后主要便于理解“继承的原理”
2【重点】【级别要求:理解】为何要使用继承;
3【重点】【级别要求:应用】如何实现继承。
【原理层面】构造函数、原型、实例化对象的关系
需要先了解的两个概念:实例化属性、原型属性
1 每个函数都有一个prototype属性,该属性是一个指针,指向原型对象
2 原型对象包含一个指向构造函数的指针
3 实例化对象内部存在一个指针(_proto_),指向构造函数的原型对象
4 所有的实例化对象(通过构造函数创建的),俊辉继承属性prototype引用的对象的所有属性
简单理解:
1 每个函数都有自己自身以及一个原型对象。该函数可以通过一种途径(prototype)访问到自己的原型对象,而每个函数的原型对象都有一个用于标识所有者的属性(construction指向该函数)
2 如果属性是在原型上创建的(xxx.prototype.属性名),在构造函数实例化时,该属性并不会被复制一份,而是会给实例化的函数一个钥匙(指针),用于访问原型上的属性。
3 对于在构造函数中创建的属性(this.属性名 = 属性值), 在构造函数实例化时。该属性会被复制一份,并作为“实例化的函数”的四有属性而存在(并不会出现在原型上)
实例化函数的对象值
1 首先寻找实例化自身,是否有该属性
2 如果自身木有该属性,则循着_proto_的指向,向上寻找到构造函数的原型,查看有木有这个属性。
3 寻找模式类似于“作用域链”, 对于属性循着原型逐层寻找而构成了“原型链”, 原型链和继承息息相关。
原型链与继承的构成
利用原型,让一个引用类型继承另一个引用类型的属性和方法
即将一个构造函数(1) 实例化的结构,赋值给另一个构造函数(2)的原型。那么2就实现了对1的继承。
为何要使用继承
主要目的: 少写代码
新功能函数 = 原有功能函数 + 功能;
新功能函数 - 原有功能函数中的部分 + 新功能(修改一些不同的)
通常要求:旧功能函数是新功能函数的基础,或者新功能函数是旧功能函数的优化和扩展
实现继承的常见的3中方法
1最简单的继承
2经典继承/伪造对象
3组合继承
最简单的继承
原理:将实例化的对象赋值给子级的原型
劣势:任意属性修改都会在实例化中反映出来
经典继承/伪造对象
原理:借用构造函数实现继承。通过改变this指向,指向当前的实例化对象。
劣势:不能够解决复用性问题(方法必须放置于构造函数当中才能够继承到function Son(){People。call(this);})
组合继承/伪经典继承
原理:简单继承(对复用性的处理) + 经典继承(属性私有化) = 组合继承。 即取简单继承和经典继承的优势,当前最为常用的一种继承方式。
实现继承的基本思路 : 使用原型链实现对原型属性和原型方法的继承; 通过构造函数实现对实例化属性的继承。
组合继承的步骤
1 利用call方法进行属性继承
2 使用for-in循环,借助原型链,实现原型属性和方法的继承
到此为止继承完毕
3 对于功能扩充或者修改,只需要在子级中书写与父级不同的内容即可