HLJ 发布于
2025-06-11 09:31:21
0阅读

JavaScript 构造器和操作符 "new"

JavaScript 构造器和操作符 "new"

在 JavaScript 中,构造器函数和 new 操作符用于创建多个相似对象的实例,这是实现面向对象编程的重要方式之一。

构造器函数

构造器函数(Constructor Function)是用于创建对象的常规函数,但有两个约定:

  1. 首字母大写(命名约定)
  2. 只能通过 new 操作符执行
function User(name) {
  this.name = name;
  this.isAdmin = false;
}

let user = new User("Jack");
console.log(user.name); // Jack
console.log(user.isAdmin); // false

new 操作符的工作原理

当使用 new 调用函数时,会发生以下步骤:

  1. 创建一个新的空对象 {}
  2. 将这个新对象的 [[Prototype]](即 __proto__)链接到构造函数的 prototype 属性
  3. this 绑定到这个新对象
  4. 执行函数体(通常会为 this 添加属性)
  5. 如果函数没有返回对象,则自动返回这个新对象

构造器的返回值

通常构造器没有 return 语句,但如果存在:

  • 如果返回对象,则 new 返回该对象而不是 this
  • 如果返回原始值,则忽略
function BigUser() {
  this.name = "John";
  return { name: "Godzilla" }; // 返回这个对象
}

console.log(new BigUser().name); // Godzilla

function SmallUser() {
  this.name = "John";
  return 1; // 被忽略
}

console.log(new SmallUser().name); // John

验证是否通过 new 调用

可以使用 new.target 属性来检查函数是否通过 new 调用:

function User() {
  if (!new.target) {
    throw new Error("必须使用 new 调用!");
  }
  // 或者强制使用 new
  // if (!new.target) {
  //   return new User();
  // }
}

User(); // 报错
new User(); // 正常

构造器中的方法

可以在构造器中添加方法:

function User(name) {
  this.name = name;
  
  this.sayHi = function() {
    console.log("My name is: " + this.name);
  };
}

let john = new User("John");
john.sayHi(); // My name is: John

构造器 vs 工厂函数

除了构造器模式,还可以使用工厂函数创建对象:

function createUser(name) {
  return {
    name,
    isAdmin: false
  };
}

let user = createUser("Jack");

区别:

  • 工厂函数不使用 new,显式返回对象
  • 构造器自动创建并返回对象,this 指向新对象

最佳实践

  1. 构造器函数首字母大写
  2. 始终使用 new 调用构造器
  3. 考虑使用类语法(ES6+),它是构造器函数的语法糖
class User {
  constructor(name) {
    this.name = name;
  }
  
  sayHi() {
    console.log(this.name);
  }
}

let user = new User("John");
user.sayHi();

构造器函数和 new 操作符是 JavaScript 原型继承的基础,理解它们的工作原理对于掌握 JavaScript 面向对象编程至关重要。

当前文章内容为原创转载请注明出处:http://www.good1230.com/detail/2025-06-11/786.html
最后生成于 2025-06-13 20:52:32
此内容有帮助 ?
0