JavaScript · 主观题 · 第 20 题
前端与全栈开发面试 · 第 20 题
讲讲 JavaScript 的原型链,以及 class 继承和原型继承的关系。
参考答案
1. 每个对象都有内部的 [[Prototype]](可以用 Object.getPrototypeOf 获取),访问属性时先找自身,找不到就沿原型一路向上,直到 Object.prototype,它的原型是 null。
2. 函数有 prototype 属性;new F() 创建的实例,其原型指向 F.prototype;F.prototype.constructor 指回 F。
3. instanceof 判断的是右侧构造函数的 prototype 是否出现在左侧对象的原型链上。
4. ES5 继承的常见写法:子构造函数里 Parent.call(this) 继承实例属性,Child.prototype = Object.create(Parent.prototype) 继承方法,再修正 constructor,这就是寄生组合继承。
5. ES6 class 是这套机制的语法糖:extends 同时设置了 Child.prototype 的原型和 Child 本身的原型(用于继承静态方法);子类构造函数必须先调用 super() 才能使用 this。
6. 方法放在原型上供所有实例共享,不要在原型上放引用类型的可变数据。
解析
属性查找过程、new 的原型指向、class 是语法糖三点要讲清楚。