1、对于如下代码,调用arr.reverse()的时候会让数组实现逆序排,调用arr.toString()会用字符串形式展示数组内容。那么问题来了,arr的reverse方法是在哪里定义的?toString方法是哪里定义的?
let arr = [1, 3, 2, 0]
arr.reverse()//[0, 2, 3, 1]
arr.toString()//"0,2,3,1"
arr在js里的数据类型是"object",也就是对象,js中的对象都含有一个__proto__属性,当使用对象的属性时,先从自己的属性开始找,如果找不到则从__proto__里找。
2、arr.__proto__这个属性指向的是Array.prototype
由上图可知arr.__proto__===Array.prototype
则arr.__proto__.reverse === Array.prototype.reverse
则arr.__proto__.reverse===arr.reverse
3、Array.prototype里也有__proto__属性,它指向Object.prototype
由上图可知,Array.prototype.__proto__===Object.prototype则
Array.prototype.__proto__===arr.__proto__.__proto__
arr.__proto__.__proto__===Object.prototype
arr.__proto__.__proto__.toString===Object.prototype.toString
arr.__proto__.__proto__.toString===arr.toString
4、由此可见这些方法都是定义在arr的原型链上,如下图:
这条顺着__proto__属性往上找的过程就形成了原型链。
资料来源:饥人谷课程