忽然发现本身好久没写过什么东西了html
其实从博客更新的速度上就能够看出一我的近期有没有成长函数
对 …… 我没有成长url
也能够由此看出本身选择的企业是否是对的prototype
对 …… 我不会离职……指针
略略略 来咬我啊……htm
因而乎 我把本身之前其余博客发的文章放出来了 对象
欢迎骚扰 欢迎指点 小女子 不胜感激……blog
——————————————我是分割线————————————————继承
1.构造函数,实例原型链
构造函数是用来建立对象的函数 与其余函数的区别在于调用方式不一样
- 若是经过new操做符来调用 就是构造函数
- 若是没有经过new操做符来调用的就是普通函数
在var person1 = new person()中 经过new操做符 调用了函数person 并生成了person1
这里的person就成为构造函数 person1称为person函数对象的一个实例
其实能够经过实例的constructor 访问对应的构造函数 (可是其实constructor并非实例的属性)
2.原型对象
咱们建立一个函数的时候 函数对象都会有一个prototype属性 这个属性是一个指针
指向他的原型对象 原型对象的本质也是一个对象
举个栗子:
3.构造函数 原型对象和实例的关系
由图能够看出
- 函数对象的prototype指向原型对象 原型对象的constructor指向函数对象
- 实例对象的prototype属性指向原型对象,这里的perototype是内部属性 是不容许访问的
- 这个属性的做用:容许实例经过该属性访问原型对象中的属性和方法
解释:console.log(person1.constructor)时说到能够经过实例的constructor访问构造函数
可是constructor本质上是原型对象的属性
4.继承
原型链:继承的主要思路就事利用原型链
让一个引用类型继承另外一个引用类型的属性和方法
- 原型对象经过contructor属性指向构造函数
- 实例经过prototype属性指向原型对象
原理上图
- 首先咱们建立了A和B 两个函数对象 同时也生成了他们的原型对象
- 接着 给A的原型对象添加了sayA()方法
- 而后是关键的一部B.prototype = new A();让函数对象B的prototype指针指向了一个A的实例
这也就是为何最后B的原型对象里面不在有constructor属性
(其实B原本有一个真正的原型对象 本来能够经过B.prototype访问 可是咱们如今改写了这个指针
使他指向了另外一个对象,因此B真正的原型对象如今无法被访问了 取而代之的这个新的原型对象是
A的一个实例 因此没有了constructor属性了)
- 接下来给这个B.prototype指向的对象增长一个sayB方法
- 而后生成了一个实例b1
- 最后调用了b1的sayB方法 能够执行
由于b1有prorotype属性能够访问B.prototype里的方法
由于b1沿着prototype属性能够访问B.prototype ,B.prototype能够继续沿着prototype属性访问 A.prototype,最终在A.prototype上找到 了sayA方法 因此能够执行
因此如今的结果就至关于 b1继承了A的属性和方法 这种由prototype不断把实例和原型对象联系起来的结构就是原型链 也是js中 继承主要的实现方式
该篇文章参考思否! 主要方便本身记忆的同时 传播 好的内容 !但愿对你们有所帮助!