theme: simplicity-green
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
图中红线部分就是我们原型链的部分了,我们可以看出来都是指向一个对象的原型,所以我们称他为原型链,但是在我们的继承方法中,有一个类型叫做原型链继承,如果不画红线,是俩个独立的对象,我们应该怎么把他们连起来呢?
我们转化成代码来看一下
let dosoming = function(){
this.name = 'dosoming'
}
dosoming.prototype.sayDosoming = function(){
console.log('dosoming');
}
let soming = function(){
this.name = 'soming'
}
soming.prototype.saySoming = function(){
console.log('soming');
}
现在dosoming和soming是俩个独立的对象,各自只能访问到各自的原型链上的函数,如果我要将他们俩个通过原型链的方式继承起来,其实就是通过代码完成红色线的部分,将dosoming和soming的原型对象通过线连接起来,那就是形成一条原型链,也就是我们所要的原型链继承
原型链继承
Child1.prototype = new Parent();
我们可以看到原型链继承就是简单的一行代码,那这样为什么就能实现继承了呢,我们从图中来看一下这个原型链继承,图中绿色的线表达了我们的上面那一行代码。
那为什么这样就能将俩个没有关系的对象变成继承关系和原型链关系呢?
一开始笔者的理解错了,认为Child1.prototype = new Parent()是将dosoming.prototype用箭头的方式指向soming通过new出来的n1,但是我们结合代码和图就很好理解来,代码
Child1.prototype = new Parent()是一个赋值关系,同时也是一个相等的关系,我们来讲绿色的线修改一下
我们将俩个对象合并起来,因为我们已经通过代码将他们赋值相等了,接下来我们再来连一下我们的__proto__,看看是什么效果吧!
__proto__指向的是实例的原型,所以图中的d1和s1都指向直接的原型,我们来讲=优化一下,就能显出原型链的真实面目了
dosoming.prototype = new soming()
// console.log(dosoming.prototype);
let d1 = new dosoming()
console.log(d1.__proto__ == dosoming.prototype);//true
console.log(d1.__proto__ instanceof soming);//true
console.log(d1.__proto__.__proto__ == soming.prototype);//true