原型链
理解了以上这些是什么之后,那么接下来,我们就可以来研究一下什么是原型链
了!
并且js
中实现继承
主要是依靠原型链
来实现! 所以我们才需要学习原型链
的原理!
在学习原型链
之前,你先记住一个概念,就是原型链
: 其实是实例对象
和原型对象
之间的链条!
我们之前不是说了 实例对象
在搜索属性
或者方法
的优先级吗 ?
就是说如果当你调用一个属性或者方法时, 其实首先是会在当前实例对象
上进行搜索, 如果没有那么就到构造函数中去进行搜索,如果还是没有,那么就到原型对象当中去是进行搜索
那么有人就会问了,如果 当前构造函数的原型对象中也没有呢? 接下来js
会干什么呢?
揭晓谜底吧,请看下图:
如图
分析
以上这张图就是默认情况下,如果说person
这个实例对象
如果顺着__proto__
这个链条没有在Person.prototype
中找到想找的方法或数据,那么又会继续顺着__proto__
这个链条往上走,继续寻找,
那么找谁呢? 这是js
设计者规定的,默认就会找到一个Object.prototype原型对象
当中去, 那么这样子的查找链条
也就形成了原型链
并且既然这里有一个所谓的Object.prototype原型对象
那么这个对象也会有一个属性叫constructor
的属性,来返指向其它的构造函数Object
, 这里的Object.prototype原型对象
自身其实也有一个__proto__
, 因为我们说了,实例对象
才有这个属性,所以还可以向上访问,不过这里再往上就只能返回null
了,因为没有了!
小结
js
其实在面向对象的设计之初就是依照近原则,当我们要使用一个方法和数据时,js
会优先查找自身,如果没有就查找离自己最近的,这里也就指的是构造函数,如果自己没有,他就会沿着原型链__proto__
这个链条,向上查找,如果还没有找到,它还会沿着原型链
继续向上查找,直到找到Object.prototype原型对象
Object.prototype原型对象
默认也是会有一些方法在里面的
如图
所以这里 其实就是解释了js
中每个函数都存在原型对象
属性prototype
并且在js
中所有函数
的默认的原型对象
都是Object
的实例对象
,而且默认还形成一个层层嵌套的形式,这也就是默认原型链
那我们要Object
的原型对象
干嘛,它里面又没几个方法
和属性
来满足我们日常开发的需求对吧,
所以我们需要扩大
我们的原型链条
, 这就要谈论到继承
了
原型对象中的this指向
当我们使用new
操作符来执行一个函数的时候,这个时候,构造函数
中的this
会指向到该实例对象
上
而原型对象
中如果函数方法
出现的this
那么也是指向的该实例对象
举个栗子
function Test(name,age,company,salary){
this.username=name;
this.age=age;
this.company=company;
this.salary=salary;
console.log(this);//打印this
}
Test.prototype.say=function (){
console.log(this); //打印this
}
var test=new Test('张三',18,'重庆科技','9K');
//打印实例对象
console.log(test);
结果如下
由此可见构造函数
中的this
与原型对象
中方法中的this
其实就是当前new
出来的实例对象