原型链
来源:原型链 一次学习终生受用
数组方法和原型
在JS中,数组拥有各种数组方法
1 | const arr = new Array(1,2,3) |
当控制台输出arr时,并没有输出所谓数组方法,但数组方法确实存在着
其实这些数组方法就在原型链里
1 | const arr = new Array(1,2,3) // -> [ 1, 2, 3 ] |
原型
prototype是在函数上的一个属性,它是一个对象,被称为原型/原型对象
创建一个函数时,它会被默认添加上一个prototype属性
1 | function fun () {} |
__proto__是在对象上的一个属性,它指向了该对象的构造函数的prototype,被称为隐式原型
1 | console.log(new fun('yajue').__proto__ === fun.prototype) // -> true |
原型链
既然函数上的prototype是一个对象,那么它应该会有属于自己的__proto__
1 | console.log(fun.prototype.__proto__ === Object.prototype) // -> true |
那么Object.prototype
有没有自己的__proto__?答案是没有
1 | console.log(Object.prototype) // -> [Object: null prototype] {} |
Object.prototype
已经是原型链的顶层了,如果这里不设计为null,那么将会无限地溯源上去,这不现实
一整个原型链大概是这样:
1 | // 如果这个对象是fun构造函数的一个实例 |
查找规则
先从自身找属性,如果找到则停止;如果没找到则往原型上找
1 | function fun (name) { |
评论