返回

构造函数的本质是创建对象

前端

构造函数概述

构造函数是一种创建对象的函数。通过使用构造函数,可以定义对象的数据结构和行为。构造函数的目的是为对象定义一个公共接口,以及为该类对象提供共同的方法和属性。JavaScript中的构造函数通常以大写字母开头,比如 Person()。

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

上述代码定义了一个 Person 构造函数,它接收两个参数:name 和 age。当调用这个构造函数时,它会创建一个新的 Person 对象,并将 name 和 age 作为对象的属性。

const person1 = new Person('John', 30);
const person2 = new Person('Mary', 25);

上述代码创建了两个 Person 对象:person1 和 person2。这两个对象都有 name 和 age 属性。

原型

原型是 JavaScript 中的一种特殊对象,它是所有其他对象的祖先。每个对象都有一个原型,原型也是一个对象,它有自己的属性和方法。当一个对象访问一个不存在的属性或方法时,它会沿着原型链向上查找,直到找到该属性或方法。

const person1 = new Person('John', 30);
console.log(person1.name); // John
console.log(person1.age); // 30
console.log(person1.toString()); // [object Person]

上述代码创建了一个 Person 对象 person1,并打印了它的 name、age 和 toString() 方法。其中,toString() 方法是 Object 原型的内置方法,它返回对象的字符串表示形式。

继承

继承是指一个对象从另一个对象那里继承属性和方法的能力。在 JavaScript 中,继承可以通过原型链来实现。

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

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

上述代码定义了一个 Student 构造函数,它继承了 Person 构造函数。Student 构造函数接收三个参数:name、age 和 major。当调用这个构造函数时,它会先调用 Person 构造函数来创建 Person 对象,然后将 major 作为对象的属性。

const student1 = new Student('John', 30, 'Computer Science');
console.log(student1.name); // John
console.log(student1.age); // 30
console.log(student1.major); // Computer Science
console.log(student1.toString()); // [object Student]

上述代码创建了一个 Student 对象 student1,并打印了它的 name、age、major 和 toString() 方法。其中,toString() 方法是 Object 原型的内置方法,它返回对象的字符串表示形式。

封装

封装是将数据和行为封装在一个对象中,使其与其他对象隔离开来的过程。在 JavaScript 中,可以通过构造函数来实现封装。

function Person(name, age) {
  // 私有属性
  const _name = name;
  const _age = age;

  // 公共方法
  this.getName = function() {
    return _name;
  };

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

上述代码定义了一个 Person 构造函数,它封装了 name 和 age 属性,并提供了 getName() 和 getAge() 方法来访问这些属性。

const person1 = new Person('John', 30);
console.log(person1.getName()); // John
console.log(person1.getAge()); // 30
console.log(person1._name); // undefined
console.log(person1._age); // undefined

上述代码创建了一个 Person 对象 person1,并打印了它的 name 和 age 属性。其中,_name 和 _age 是私有属性,不能直接访问。