JS中的原型链 一、原型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 class People { constructor (name) { this .name = name } eat() { console .log(`${this .name} eat something` ) } } class Student extends People { constructor (name, number) { super (name) this .number = number } sayHi() { console .log(`姓名 ${this .name} 学号 ${this .number} ` ) } } const xialuo = new Student('夏洛' , 100 )typeof People typeof Student typeof xialuo console .log( xialuo.__proto__) console .log( Student.prototype) console .log( xialuo.__proto__ === Student.prototype)
原型关系:
每个class 都有显示原型prototype
每个实例 都有隐式原型__proto__
实例的__proto__
指向对应 class的prototype
原型的执行规则:
获取属性xialuo.name或执行方法xialuo.sayhi()时
先在自身属性和方法寻找
如果找不到则自动去__proto__
中查找
二、 原型链 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class People { constructor (name) { this .name = name } eat() { console .log(`${this .name} eat something` ) } } class Student extends People { constructor (name, number) { super (name) this .number = number } sayHi() { console .log(`姓名 ${this .name} 学号 ${this .number} ` ) } } const xialuo = new Student('夏洛' , 100 )console .log( Student.prototype.__proto___)console .log( People.prototype )console .log( People.prototype === Student.prototype.__proto__)
在vscode
调试中可以查看原型链的类型
三、 原型链知识点 3.1 知识点1 知识点:
如果A沿着原型链可以找到B.prototype
, 那么A instanceof B 为 true
1 2 3 4 5 6 7 xialuo是Student类实例化的, Student类的父类是People xialuo instanceof Student / / true xialuo instanceof People , / true xialuo instanceof Object , / true [] instanceof Array [] instanceof Object {} instanceof Object
解析:
A沿着原型链可以找到B.prototype
,即原型链上有B对象
例如:func.__proto__ -> Function.prototype, Function.prototype.__proto__ -> Object.prototype, Object.prototype.__proto__ -> null
func
原型链上有Object.prototype
func instanceof Object 为 true
3.2 知识点2 知识点:
如果A对象上没有找到x属性,那么会沿着A对象的原型链找x属性
解析:
1 2 3 4 5 6 7 8 9 10 11 const obj = {}Object .prototype.x = 'x' const func = () => {}Function .prototype.y = 'y' func.x = 'x' func.y = 'y' obj.x = 'x' obj.y = undefined
四、常见面试题 4.1 问题1 instanceof
的原理,并用代码实现
知识点: 如果A沿着原型链可以找到B.prototype
, 那么A instanceof B 为 true
1 2 3 4 5 6 7 8 9 10 11 const instanceOf = (A, B ) => { let p = A while (p){ if (p.__proto__ === B.prototype){ return true } p = p.__proto__ } return false }