new调用时this绑定到新创建的实例对象上;该对象继承构造函数prototype,若构造函数显式返回非null对象则返回该对象,否则返回新实例。

当使用 new 关键字调用函数时,JavaScript 会自动将该函数作为构造函数执行,并把 this 绑定到一个新创建的空对象上——这个对象会继承构造函数的 prototype,最后函数默认返回它(除非显式返回一个非 null 的对象)。
new 调用时 this 的绑定过程
执行 new Foo() 时,引擎内部按以下步骤处理:
- 创建一个全新的空对象(即实例)
- 将该对象的
[[Prototype]]指向Foo.prototype - 以该新对象为
this,调用Foo函数(即执行Foo.call(新对象, ...args)) - 若
Foo显式返回一个“对象类型”值(非null、非原始值),则返回该值;否则返回新创建的对象
构造函数中 this 指向的是新实例
在函数体内部,this 就是那个刚被创建出来的实例对象。你可以直接给它添加属性或方法:
function Person(name) {
this.name = name; // this → 新实例
this.sayHello = function() {
console.log('Hello, ' + this.name);
};
}
const p1 = new Person('Alice');
console.log(p1.name); // 'Alice'
p1.sayHello(); // 'Hello, Alice'注意:箭头函数不适用 new 绑定
箭头函数没有自己的 this,也不支持 new 调用。如果尝试 new (() => {}),会抛出 TypeError: Arrow functions are not constructors。所以构造逻辑必须写在普通函数中。
手动模拟 new 的行为(加深理解)
下面是一个简易版 myNew,能体现 this 如何绑定到新对象:
function myNew(constructor, ...args) {
const obj = Object.create(constructor.prototype); // 创建新对象并设置原型
const result = constructor.apply(obj, args); // this 绑定到 obj 并执行
return (result !== null && typeof result === 'object') ? result : obj;
}
function Dog(name) {
this.name = name;
}
Dog.prototype.bark = function() { return 'Woof!'; };
const dog = myNew(Dog, 'Buddy');
console.log(dog.name); // 'Buddy'
console.log(dog.bark()); // 'Woof!'Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











