在 JavaScript 构造函数中,通过 this 绑定实例属性是最基础方式:每次 new 调用时 this 指向新对象,赋值即创建自有属性,各实例独立;方法应定义在 prototype 上以共享,避免内存浪费;class 的 constructor 同理。

在 JavaScript 构造函数中,通过 this 绑定实例属性是最基础、最常用的方式:只要在构造函数内部对 this 赋值,该属性就会成为新创建实例的自有属性。
直接赋值给 this
这是最直观的方式。每次用 new 调用构造函数时,this 指向新生成的空对象,给它添加属性就完成了实例属性的绑定。
- 属性会存在于实例本身(即对象的自有属性),不是从原型继承来的
- 每个实例都拥有独立的一份副本,互不影响
- 示例:
function Person(name, age) {
this.name = name; // 实例属性
this.age = age; // 实例属性
this.sayHello = function() { // 方法也是实例属性(不推荐频繁这样做)
console.log(`Hello, I'm ${this.name}`);
};
}
const p1 = new Person('Alice', 30);
const p2 = new Person('Bob', 25);
console.log(p1.name); // 'Alice'
console.log(p2.name); // 'Bob'
console.log(p1.sayHello === p2.sayHello); // false(每个实例都有自己的函数副本)
避免在构造函数中重复创建函数
把方法直接赋给 this 虽然可行,但会导致每个实例都保存一份相同的函数,浪费内存。更合理的方式是把方法定义在原型上,只绑定数据属性到 this。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 数据(如 name、age、id)适合放在实例上,因为值因对象而异
- 行为(如方法)优先放在
prototype上,实现复用 - 示例:
function Car(brand, model) {
this.brand = brand; // ✅ 实例属性:每个车品牌不同
this.model = model; // ✅ 实例属性:每个车型不同
this.isRunning = false; // ✅ 状态类属性也放实例上
}
Car.prototype.start = function() { // ✅ 方法放原型,共享
this.isRunning = true;
};
const car1 = new Car('Toyota', 'Camry');
const car2 = new Car('Honda', 'Civic');
注意 this 的指向时机
只有在用 new 调用时,构造函数内的 this 才指向新实例。如果直接调用(没加 new),this 通常指向全局对象(非严格模式)或 undefined(严格模式),导致意外绑定到全局或报错。
立即学习“Java免费学习笔记(深入)”;
- 建议构造函数名首字母大写,作为约定提醒自己要用
new - 可在构造函数开头加防护,防止忘记
new:
function User(name) {
if (!(this instanceof User)) {
return new User(name); // 自动补 new
}
this.name = name;
}
ES6 类中的 this 绑定逻辑相同
使用 class 语法时,constructor 内部的 this 同样用于初始化实例属性,本质和函数构造器一致。
- 字段声明(如
name = 'default')会在 constructor 执行前初始化(需实验性支持或转译) - 更稳妥的做法仍是显式在 constructor 中赋值:
class Animal {
constructor(species, sound) {
this.species = species; // ✅ 实例属性
this.sound = sound;
}
makeSound() {
console.log(this.sound);
}
}

















