js原型链理解

关于原型链的问题也是领悟了好久,有时候忽然以为什么都懂了,但下一个问题出现使人一脸蒙比,好像又什么都不懂,这是最近的一点经验,记下来方便之后复习。函数

先贴上最经典的原型链图,说实话,这图是真的很精髓了this

首先咱们要知道这句话: js中全部的东西(固然都是对象)都有__proto__,全部的函数除了有__proto__,还有prototype;spa

而后咱们要区分这两个东西,__proto__和prototype.prototype

1. __proto__,起初我不明白为何全部的名字都是英文的,这个非得要弄几个杠。如今终于以为这是很是形象的,由于__proto__表明着指针,下面咱们统一把这个叫原型指针(本身叫的,也不知道有没有官方叫法),它的含义很明显了,这个属性是指向某个东西,就是构造函数的原型对象,实际上也就是那个原型对象在堆空间里的内存地址指针

2. prototype,他才是所谓的函数的原型对象,他确定含有的两个属性。1 constructor,表明这个东西是哪一个函数的原型对象;2,他也是对象,确定也有原型指针;code

反正我开始的理解难点是在这里:子类不是继承来自父类的原型吗。那这个子类的指针__proto__直接就指向父类(构造函数),这样一级级找上去不久行了?这不是很符合他来自于父类吗?咱们看一下,这样找到Funtion(就是途中第三个boss,我叫它大function)的时候,它的原型指针应该指向谁呢?明显没有了,由于他就是全部函数的爸爸,没有比它更高级的构造函数了。因此这种是行不通的。哦,这个也有解决办法,那咱们也让这个大function的指针指向null。可是这样作会有很大的缺点,咱们在接下来js采用的方法会说到对象

js采用了另外一种办法,咱们给每一个构造函数(全部的函数均可以叫构造函数)都定义一个prototype属性。让子类的这个指针不是指向构造函数,而是指向构造函数的prototype(原型对象),这个对象中的constuctor属性反过来指向这个函数自己,而后它的原型指针天然也要指向它的构造函数的原型对象,像这样一个对象的构造函数是谁呢。就是咱们的Object(大object)。开辟了一个新属性prototype有一个很大的好处就是,咱们能够把构造函数想共享给全部子类的那部分属性、方法和不能共享的那部分隔离开,由于每一个实例对象总有些东西是本身特有的,每一个实例都不同,好比名字(私有属性),这种就直接在构造函数里用this.name 定义。只把须要共享,传承下去的那部分放在prtotype原型对象里面就行了。blog

下面咱们一个对比的代码就能明白那些共享部分是怎么继承的了继承

 1 //先肯定一下角色。Father是本身的构造函数,child是它的一个实例
 2 function Father(){};
 3 var child= new Father;
 4 child.__proto__ == Father.prototype;
 5 child.__proto__.__proto__ == Father.prototype.__proto__ == Object.prototype
 6 child.__proto__.__proto__.__proto__ ==Father.prototype.__proto__.__proto__ == Object.prototype.__proto__ == null
 7 //就经过__proto__指针链不断的访问到上一级原型对象里共享的方法
 8 //本身封装的构造函数里 咱们也能够加入要分享的方法,只须要加到Father的
 9 //原型对象prototype,那全部的子类就能够访问到了
10 Father.prototype.say=function(){console.log('hello world')}
相关文章
相关标签/搜索