原型链和 class 怎么理解
先理解原理和示例,再练习完整口述与追问。
回答要点
属性查找先看对象自身,再沿原型链查找。区分实例、构造函数的 prototype 和对象的内部原型;class 建立在原型机制上,同时有自己的语法语义。能解释 new 的主要步骤。
原理拆解
读取 obj.name 时先查自身属性,缺少时沿 [[Prototype]] 向上查找,直到 null。构造函数的 prototype 属性通常是 new 创建实例时所使用的原型对象;实例自身的 [[Prototype]] 与构造函数对象的 prototype 不是同一个概念。class 把实例方法放到原型上,字段通常归实例所有,并额外具有严格模式、不可不带 new 调用等语义。
示例与推演
class Person {
constructor(name) { this.name = name }
greet() { return this.name }
}
const p = new Person('Lin')
console.log(Object.getPrototypeOf(p) === Person.prototype) // true
console.log(p.hasOwnProperty('name')) // true
console.log(p.hasOwnProperty('greet')) // false
greet 由实例沿原型找到,多个实例可共享同一个方法。
易错点
constructor 属性可以被修改,不能作为绝对可靠的类型判断。继承不仅是复制字段;父类引用类型状态若错误地放到共享原型,也会让不同实例互相影响。
参考回答可直接练习口述
对象找属性时先看自身,找不到再沿内部原型链接着查,直到 null。构造函数的 prototype 是用于普通 new 实例建立原型的对象,不等于构造函数自身的内部原型。new 的基本过程是创建对象、连接原型、用它作为 this 调用构造逻辑,再根据构造器返回值确定结果。class 建立在原型机制上,但还有严格模式、必须 new 调用、派生类 super 等规则,不是随意的文本替换。