JS原型继承的原理
- 假设让classB继承classA
- 让classB的prototype(含有三个值,自定义属性方法,constructor,
__proto__
) - 目标:
1. classB拥有classA的属性方法,classB可以有自己的额外属性
2. classB的父级是A
3. class B的构造器是自己的 -
过程:属性/父级/构造器
- classB自己写属性,在classB中通过classA.call(this)//自定义属性并使用A的属性
- classB的prototype=classA//继承classA的
__proto__
,属性方法 - classB.prototype.constructor=classB//修改构造器
首先 :自定义对象原型__proto__(Object)中有两个部分
- 自带第二层__proto__(Object)这里拥有Object通用属性与方法
- 自带的constructor构造器,实际是一个对象,拥有prototype属性,属性值为
-
- 每个对象都具有一个名为__proto__的属性;
- 每个构造函数(构造函数标准为大写开头,如Function(),Object()等等JS中自带的构造函数,以及自己创建的)都具有一个名为prototype的方法(注意:既然是方法,那么就是一个对象(JS中函数同样是对象),所以prototype同样带有__proto__属性);
- 每个对象的__proto__属性指向自身构造函数的prototype;
-
- prototype是构造函数独有的属性;
- 对象的__proto__属性通常与其构造函数的prototype属性相互对应;
- 所有构造函数的的prototype方法的__都指向__Object.prototype(除了…Object.prototype自身)
其次:prototype来自于constructor
- constructor指明了构造函数
自定义对象有两部分
- 自带属性
- 自定义的方法与属性
__proto__
(指向constructor)- constructor(负责创建实例的初始化工作)
-
- name
- prototype
- 自定义的属性方法
__proto__
原型继承classA修改了classB对象构造器的prototype
- 修改prototype的同时
__proto__
指向classA构造器的prototype - 此时class B的构造器中全部与class A相同,只需要修改classB的构造器等于classB对象就可以
对象的构造器在原型中
- 修改构造器就要在原型中修改
prototype中有三部分
- 自定义属性与方法
- constructor
__proto__
对象没有构造器 类有构造器
区别在于 对象有属性方法,__proto__
类有属性方法,constructor,__proto__
- 修改prototype指的是修改原型链上最近一层的prototype
- 让prototype=new obj使最近一层prototype具有obj的属性方法与
__proto__
- 使prototype.constructor=classB使构造器变成classB的