原型链和 class 怎么理解

先理解原理和示例,再练习完整口述与追问。

属性查找先看对象自身,再沿原型链查找。区分实例、构造函数的 prototype 和对象的内部原型;class 建立在原型机制上,同时有自己的语法语义。能解释 new 的主要步骤。

读取 obj.name 时先查自身属性,缺少时沿 [[Prototype]] 向上查找,直到 null。构造函数的 prototype 属性通常是 new 创建实例时所使用的原型对象;实例自身的 [[Prototype]] 与构造函数对象的 prototype 不是同一个概念。class 把实例方法放到原型上,字段通常归实例所有,并额外具有严格模式、不可不带 new 调用等语义。

js
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 等规则,不是随意的文本替换。