跳到正文

原型链与 new ​

  • 状态:未准备
  • 适用方向:前端 / Go 全栈
  • 最近复习:待填写
  • 下次复习:待安排

一句话回答 ​

对象读取自身没有的属性时,会沿内部原型链向上查找直到 null;new 将实例与构造器的 prototype 联系起来,并按构造器返回值规则决定结果。

原理解释 ​

prototype 和对象原型有什么区别? ​

对象的内部 [[Prototype]] 可通过 Object.getPrototypeOf 读取。普通构造函数的 .prototype 是 new 创建实例时使用的原型对象。函数自身也有自己的内部原型,这与它的 .prototype 不是同一个概念。并非所有函数都具有可用于构造的 prototype,例如箭头函数不可构造。

js
function User(name) { this.name = name }
User.prototype.say = function () { return this.name }
const user = new User('A')
console.log(Object.getPrototypeOf(user) === User.prototype) // true
console.log(Object.hasOwn(user, 'name')) // true
console.log(Object.hasOwn(user, 'say')) // false

new 的核心步骤 ​

创建对象 → 设置原型 → 用新对象作为 this 调用构造器 → 若构造器显式返回对象或函数则采用它,否则返回新对象。这是普通构造器的学习模型,完整语义还涉及 new.target、内建构造器等。

class 与继承 ​

class 仍基于原型体系,实例方法通常在原型上,静态方法在类构造器上;实例字段属于实例。class 还增加了严格模式、不能直接调用、私有字段等语义,不能把它理解成与普通函数完全等价的文本替换。

场景与边界 ​

优先通过 Object.create 或 class 表达设计,不在热点路径动态改原型。Object.create(null) 没有 Object.prototype 上的方法,字典场景可用,但检查属性时应使用 Object.hasOwn。

项目中的应用 ​

这是通用语言基础,暂未指定个人实现证据。可阅读 SimulSpeak 的连接层入口,区分实例字段、原型方法与箭头函数字段。

常见追问 ​

  • instanceof 判断什么? 通常检查构造器的 prototype 是否在对象原型链上;还可被 Symbol.hasInstance 定制,不是万能类型判断。
  • in 和 Object.hasOwn 区别? in 包含原型链属性;后者只看自身属性。
  • 原型污染是什么? 不安全地把外部输入合并到对象上,可能修改原型并影响其他对象;应约束键和值,避免危险的递归合并。

参考资料 ​

理解机制,讲清取舍,用复盘检验掌握。