之前看到原型链虽然大致上会有些理解,但是还是会有些凌乱,不能很好的总结,今天深入地去做了一下了解,并做一个小总结。
1.原型链和__proto__
原型链实际上是通过__proto__这个属性去实现的,当我们调用一个方法时,如果没有,它就会向__proto__指向的位置去找,直到__proto__指向的值为null的时候还没有找到,就会返回错误,这也就是我们所说的原型链。
比如我们定义一个对象A:
let A = {}
当我们调用A.valueOf()时,在A对象里并没有这个方法,它就会去A.__proto__指向的Object.prototype里去寻找,就会找到。Object.prototype在原始的原型链中就是地位最最最高的一位,它的__proto__指向的值就是null。
2.prototype
prototype和__proto__一直是让人很容易觉得不太理解的部分,其实把他们当做完全不相干的两个部分就好理解了。当我们要实现一个构造函数时,我们就把方法放在函数的prototype中,因为当我们new出来一个子例时,子例的__proto__会指向构造函数的prototype,这样就可以所有生成的子例都可以通过原型链来使用到我们的方法。比如说我们要有函数A
function A() {}
A.prototype.show = () => { console.log(1) }
我们要让函数B来继承A
function B() {}
B.prototype = new A()
B.prototype.constructor = B // 子例可以通过b.constructor得知自己来自哪个构造函数
let b = new B()
b.show()
先会在当前实例上寻找show方法,找不到就会通过__proto__指向的B.prototype里去寻找,因为B.prototype已经被A的一个子例替换,所以它的__proto__就指向了A的prototype,所以我们经过了两个__proto__就找到了show方法。
以上只是我个人的一些粗浅理解,有兴趣可以共同探讨。