返回

超脱范式:理解JavaScript构造函数的精妙之处

前端

JavaScript构造函数:构建对象的蓝图

JavaScript构造函数是创建对象的模板,它定义了对象的属性和方法,并提供了创建新对象的机制。构造函数与普通函数不同,它需要使用new来调用,并且会在调用时自动执行,并返回一个指向新创建对象的引用。

构造函数的语法

构造函数的语法如下:

function 构造函数名(参数列表) {
  // 构造函数体
}
  • 构造函数名:构造函数的名称,它遵循与普通函数相同的命名规则。
  • 参数列表:构造函数可以接受任意数量的参数,这些参数将在创建新对象时传递给构造函数。
  • 构造函数体:构造函数体包含了创建新对象的代码,它可以包含任何合法的JavaScript语句。

构造函数的用法

要使用构造函数创建对象,需要使用new关键字来调用构造函数,如下所示:

let对象 = new 构造函数名(参数列表);

例如,以下代码使用Person构造函数创建了一个新的Person对象:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

let person1 = new Person("John Doe", 30);

这个Person构造函数接受两个参数:nameage,并在创建新对象时将这两个参数的值赋给对象的nameage属性。

构造函数的属性和方法

构造函数不仅可以创建对象,还可以为对象定义属性和方法。属性是对象的键值对,方法是对象的函数。

属性

要为对象定义属性,可以使用this关键字。this关键字代表当前正在创建的对象,因此可以使用它来访问和修改对象的属性。

例如,以下代码为Person对象添加了一个gender属性:

function Person(name, age) {
  this.name = name;
  this.age = age;
  this.gender = "male";
}

方法

要为对象定义方法,可以使用prototype属性。prototype属性指向一个对象,这个对象包含了所有该构造函数创建的对象共享的属性和方法。

例如,以下代码为Person对象添加了一个greet()方法:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};

构造函数的继承

构造函数可以继承其他构造函数的属性和方法。这是通过使用extends关键字来实现的。

例如,以下代码定义了一个Student构造函数,它继承了Person构造函数的属性和方法:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

function Student(name, age, major) {
  Person.call(this, name, age);
  this.major = major;
}

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

在这个例子中,Student构造函数继承了Person构造函数的nameage属性,以及greet()方法。此外,Student构造函数还添加了一个新的major属性和一个新的study()方法。

构造函数的封装

构造函数可以实现封装,将对象的属性和方法隐藏在构造函数内部,从而防止它们被外部代码访问或修改。

例如,以下代码将Person构造函数的nameage属性设为私有属性:

function Person(name, age) {
  var _name = name;
  var _age = age;

  this.getName = function() {
    return _name;
  };

  this.getAge = function() {
    return _age;
  };
}

在这个例子中,_name_age变量是私有属性,它们只能在Person构造函数内部访问。外界代码无法直接访问或修改这些属性,只能通过getName()getAge()方法来获取它们的值。

构造函数的优点

使用构造函数创建对象有很多优点,包括:

  • 代码复用:构造函数可以复用代码,避免重复编写相同