返回

对Js构造函数、原型、原型链的精心整理

前端

JavaScript 构造函数、原型和原型链:理解 JavaScript 继承的关键

概念

JavaScript 作为一门强大而多功能的编程语言,广泛应用于网页开发、移动开发、桌面应用程序和物联网等领域。要想充分理解 JavaScript,就必须掌握其继承机制和面向对象编程的基础:构造函数、原型和原型链。

构造函数:创建对象蓝图

构造函数是一种特殊类型的函数,用于创建和初始化对象。与普通函数不同,构造函数具有自己的语法和用法。

  • 以大写字母开头,表明这是一个构造函数。
  • 使用 this 引用新创建的对象。
  • 可以接收参数,这些参数将分配给新创建的对象。
  • 执行时自动返回新创建的对象。

例如:

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

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

console.log(person1.name); // John
console.log(person2.age); // 25

原型:共用属性和方法

原型是构造函数的一个属性,它是一个包含所有实例共用属性和方法的对象。当使用 new 关键字创建新对象时,该对象的原型将指向构造函数的原型。

  • 原型是一个可以包含属性和方法的对象。
  • 构造函数的原型是共享的,所有使用该构造函数创建的对象都会继承原型中的属性和方法。
  • 可以通过 __proto__ 属性访问对象的原型。

例如:

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

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}!`);
};

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

person1.greet(); // Hello, my name is John!
person2.greet(); // Hello, my name is Mary!

原型链:沿袭属性和方法

原型链是一种隐式继承机制,当一个对象访问一个不存在的属性或方法时,它会沿着原型链向上查找,直到找到该属性或方法。

  • 每个对象都有一个原型,除了 Object 对象。
  • Object 对象的原型是 null
  • 可以使用 __proto__ 属性访问对象的原型。

例如:

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

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}!`);
};

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

console.log(person1.__proto__ === Person.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__ === null); // true

ES6 中的 class 语法糖

在 ES6 中,引入了 class 关键字,它提供了一种更简洁的方式来创建和使用类。

  • class 关键字本质上仍然使用构造函数和原型来实现继承。
  • class 关键字简化了类的创建和使用,使代码更简洁。

例如:

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

  greet() {
    console.log(`Hello, my name is ${this.name}!`);
  }
}

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

person1.greet(); // Hello, my name is John!
person2.greet(); // Hello, my name is Mary!

结论

构造函数、原型和原型链是 JavaScript 中三个至关重要的概念,它们构成了其面向对象编程和继承机制的基础。通过理解这些概念,开发者可以编写出更加健壮、可维护和可扩展的代码。ES6 中引入的 class 关键字简化了类的创建和使用,为 JavaScript 的面向对象编程提供了更简洁、更现代的语法。

常见问题解答

1. 构造函数和类之间的区别是什么?

虽然类在语法上更简洁,但构造函数和类本质上是相同的。它们都使用原型来实现继承,并且行为相同。

2. 原型链是如何在 JavaScript 中工作的?

当一个对象访问一个不存在的属性或方法时,它会沿着原型链向上查找,直到找到该属性或方法。如果原型链上找不到,则返回 undefined

3. 如何查看对象的原型?

可以使用 __proto__ 属性来访问对象的原型。

4. ES6 中的 class 关键字有什么好处?

class 关键字简化了类的创建和使用,使代码更简洁,更易于阅读和维护。

5. 原型可以修改吗?

原型可以修改,但需要注意,对原型的修改将影响所有继承该原型的对象。因此,在修改原型之前,请仔细考虑潜在的后果。