返回

原型与原型链,构建面向对象编程的基础

前端

原型和原型链

在 JavaScript 中,每个函数都有一个特殊的内部属性,称为“原型”。原型是一个对象,它存储着函数的所有属性和方法。当我们使用 new 创建一个新的对象时,该对象将继承其构造函数的原型。这意味着对象将拥有原型中的所有属性和方法。

例如,以下代码创建一个 Person 构造函数:

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

Person 构造函数的原型如下:

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

现在,我们可以使用 new 关键字创建一个新的 Person 对象:

const person = new Person('John', 30);

person 对象将继承 Person 构造函数的原型,因此它将拥有 nameagegreet 属性和方法。

原型链的查找过程

当我们访问对象的一个属性或方法时,JavaScript 会首先在对象本身中查找。如果找不到,它会沿着原型链向上查找,直到找到该属性或方法为止。

例如,如果我们调用 person.greet() 方法,JavaScript 会首先在 person 对象中查找 greet 方法。如果找不到,它会沿着原型链向上查找,直到找到 Person.prototype 对象。在 Person.prototype 对象中,它会找到 greet 方法并执行它。

原型链的修改

我们可以通过修改原型链来扩展对象的功能。例如,我们可以向 Person.prototype 对象中添加一个新的方法 sayGoodbye():

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

现在,所有 Person 对象都可以使用 sayGoodbye() 方法。

总结

原型和原型链是 JavaScript 中面向对象编程的基础。通过理解原型和原型链的工作原理,我们可以更深入地理解 JavaScript 的运行机制,并编写出更清晰、更可维护的代码。