new调用构造函数时,javascript创建新对象并将其[[prototype]]指向构造函数的prototype,形成原型链起点;该绑定隐式、不可跳过,且仅适用于具有prototype属性的函数。

当使用 new 调用构造函数时,JavaScript 会创建一个新对象,并将该对象的 [[Prototype]](即 __proto__)指向构造函数的 prototype 对象。这个绑定发生在新对象创建的瞬间,是原型链形成的起点。
new 绑定发生在实例对象与构造函数 prototype 之间
执行 new Fn() 时,引擎内部会做几件事:先生成空对象,再把它的内部原型设为 Fn.prototype,然后才执行构造函数体、绑定 this。所以原型链的第一环就是:
实例 → Fn.prototype → Fn.prototype.__proto__(通常是 Object.prototype)→ null
- 这个绑定是隐式且不可跳过的,无法通过构造函数内部代码覆盖
-
Fn.prototype必须是对象(不能是null或原始值),否则实例的__proto__会回退到Object.prototype - 即使构造函数返回对象,只要不是显式返回对象,实例的原型链仍保持原样
constructor 属性不是原型链的一部分,但通常被保留
Fn.prototype.constructor 默认指向 Fn,但它只是个普通属性,不参与原型查找。修改它不会影响 new 的行为,也不会改变原型链结构。
- 如果重写
Fn.prototype = {...},记得手动恢复constructor,否则inst.constructor会指向Object - 原型链只依赖
__proto__链接,constructor只是辅助信息
箭头函数和普通函数在 new 绑定上的根本区别
箭头函数没有自己的 prototype 属性,也不能被 new 调用。尝试 new () => {} 会直接抛出 TypeError。
- 只有具有
prototype属性的函数(即“可构造函数”)才能参与 new 绑定 - 类(
class)声明本质也是函数,其原型链构建方式与普通函数一致 - Generator 函数、async 函数同样有
prototype,可以被new,但一般不这么用
原型链上属性查找与 new 绑定无关,但依赖它建立的结构
new 绑定本身不决定属性是否可访问,它只负责搭好第一级链接。后续的属性查找(如 inst.method())才沿着这条链向上搜索。
- 如果
Fn.prototype上定义了方法,所有实例都能通过原型链访问 - 在构造函数中给
this添加的属性,属于实例自身,优先于原型链上的同名属性 - 删除实例自身属性后,同名属性会自然从原型链上“浮现”出来
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











