返回

探秘 JavaScript 原型及原型链:函数的隐形力量

前端







在 JavaScript 中,原型(prototype)和原型链(prototype chain)的概念对于理解对象的继承和属性查找机制至关重要。本文将深入探究函数的 prototype 属性和原型链,揭示它们是如何影响对象行为的。

## 函数的 prototype 属性

每个函数都有一个 prototype 属性,它指向一个对象,称为函数的原型对象。原型对象包含一组属性和方法,这些属性和方法可以被该函数创建的所有对象继承。

例如,我们定义了一个名为 `Person` 的函数:

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

Person 函数的 prototype 属性默认指向一个 Object 空对象,即:

Person.prototype = {};

我们可以通过以下方式访问 Person 函数的原型对象:

const personPrototype = Person.prototype;

原型链

原型链是指从一个对象到其原型对象的链条。当我们访问一个对象的属性或方法时,JavaScript 会沿着原型链向上查找,直到找到该属性或方法为止。

例如,我们创建一个 person 对象:

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

如果我们尝试访问 person 对象的 name 属性,JavaScript 会首先在 person 对象中查找 name 属性。如果没有找到,它会沿着原型链向上查找,直到找到 Person 函数的原型对象。在 Person 函数的原型对象中,它找到了 name 属性,并将其值返回。

更改原型对象

我们可以通过修改函数的 prototype 属性来更改原型对象。例如,我们可以在 Person 函数的原型对象中添加一个 greet 方法:

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

现在,所有使用 Person 函数创建的对象都将继承 greet 方法。例如,我们可以调用 person 对象的 greet 方法:

person.greet(); // 输出:Hello, my name is John Doe.

总结

原型和原型链是 JavaScript 中对象继承的基石。通过理解函数的 prototype 属性和原型链,我们可以更好地理解对象的行为和属性查找机制。这对于编写出更加健壮和可维护的 JavaScript 代码至关重要。