为了充分理解这个问题,避免描述的太抽象,大家先写个代码
现在控制台输出的是:
我们来解读一下
1. obj 本身有一个属性 name(这是我们给它加的)
2. obj 还有一个属性叫做 __proto__(它是一个对象)
3. obj.__proto__ 有很多属性,比如 valueOf、toString、constructor 等
4. obj.__proto__ 其实也有一个叫做 __proto__ 的属性(console.log 没有显示),值为 null
虽然举的例子是个简单的,但是却很形象,现在来解释一下原型链
说到底就是和__proto__相关
比如,当我们「读取」 obj.toString 时,JS 引擎会做下面的事情:
1. 看看 obj 对象本身有没有 toString 属性。没有就走到下一步。
2. 看看 obj.__proto__ 对象有没有 toString 属性,发现 obj.__proto__ 有 toString 属性,于是找到了
在本例子中 obj.toString 实际上就是第 2 步中找到的 obj.__proto__.toString。
所原型链就是一个代码读取属性的过程
如果 obj.__proto__ 没有,那么浏览器会继续查看 obj.__proto__.__proto__
如果 obj.__proto__.__proto__ 也没有,那么浏览器会继续查看 obj.__proto__.__proto__.proto__
直到找到 toString 或者 __proto__ 为 null。
这个过程像一个链子一样,顺着走,所以取名叫原型链,
在这里我就不放图片理解了,相信大家在网上都看了很多图片了 哈哈哈