new绑定负责创建实例并初始化自有属性,原型链负责共享方法;二者协同实现数据隔离与行为复用:new创建对象并设this指向它,同时自动设置其[[prototype]]指向构造函数的prototype,使实例既能拥有独立属性,又能通过原型链访问共享方法。

new 绑定本身不直接“共享方法”,它负责创建实例并初始化数据;方法共享靠的是原型链——两者配合才让每个实例既能拥有独立属性,又能共用同一份函数代码。
new 绑定:为实例分配独立空间
执行 const p = new Person('Alice') 时,引擎会:
- 创建一个全新空对象(即后续的
p) - 把该对象设为构造函数调用时的
this,所有this.xxx = yyy都写进这个对象里(比如this.name = 'Alice') - 这个过程不涉及任何方法拷贝,只写自有属性
原型链:提供统一的方法入口
new 同时自动设置新对象的内部 [[Prototype]](可通过 __proto__ 或 Object.getPrototypeOf() 访问),使其指向 Person.prototype:
-
Person.prototype是一个普通对象,开发者通常把方法挂在这里(如Person.prototype.sayHi = function() { ... }) - 所有通过
new Person()创建的实例,其__proto__都指向同一个Person.prototype - 调用
p.sayHi()时,引擎先查p自身,没找到就顺着__proto__找到Person.prototype.sayHi
为什么能高效共享?
关键在于“一次定义、多处访问”:
- 函数对象本身是引用类型,
Person.prototype.sayHi只存一份函数地址,所有实例都通过原型链间接引用它 - 不会为每个实例重复创建函数,节省内存
- 方法内部的
this在调用时动态绑定到当前实例(如p.sayHi()中的this就是p),保证操作的是各自的数据
常见陷阱提醒
共享方法不等于共享状态:
- 如果把可变对象(如数组、对象)直接挂在
Person.prototype上,所有实例会共用它——这不是机制问题,而是误用 - 正确做法是把共享逻辑放原型上,把实例专属数据放在构造函数内通过
this初始化 -
constructor属性只是个回指(Person.prototype.constructor === Person),修改它不影响原型查找
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











