外观
原型链与 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')) // falsenew 的核心步骤
创建对象 → 设置原型 → 用新对象作为 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 包含原型链属性;后者只看自身属性。
- 原型污染是什么? 不安全地把外部输入合并到对象上,可能修改原型并影响其他对象;应约束键和值,避免危险的递归合并。