📌  相关文章
📜  JavaScript .prototype 是如何工作的?(1)

📅  最后修改于: 2023-12-03 15:16:04.130000             🧑  作者: Mango

JavaScript .prototype 是如何工作的?

在 JavaScript 中,.prototype 是一个只有函数对象才有的特殊属性。它允许我们向对象添加属性和方法,并且它们可以在该对象的所有实例之间共享。 .prototype 属性实际上是一个指向原型对象的指针。

原型链和继承

JavaScript 中的对象之间是通过原型链相互关联的。每个对象都有一个 __proto__(也可以使用 Object.getPrototypeOf())指向它的原型对象。当我们访问一个对象的属性时,JavaScript 引擎会先尝试找到该对象自身是否有这个属性,如果没有,它会继续沿着原型链往上查找,直到找到该属性或者到达原型链的顶端(null)。

.prototype 属性使用的主要场景是实现继承。当我们创建一个函数时,它会自动获取一个 .prototype 对象,我们可以在这个对象上定义属性和方法,这些属性和方法会被该函数的所有实例所继承。

让我们看一个示例:

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

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

const person1 = new Person('Alice');
const person2 = new Person('Bob');

person1.greet(); // 输出: "Hello, my name is Alice"
person2.greet(); // 输出: "Hello, my name is Bob"

在这个示例中,我们创建了一个 Person 函数,并将其 name 属性定义在了 this 对象上。我们还定义了一个 greet 方法并将其添加到 Person.prototype 上。由于 person1person2 是通过 Person 函数构造出来的实例,它们都共享同一个 Person.prototype 对象的属性和方法。

.prototype 与实例之间的关系

当我们使用 new 关键字创建一个对象实例时,JavaScript 引擎会自动将该对象的 __proto__ 属性指向构造函数的 .prototype 属性。这意味着我们可以通过实例对象访问该原型对象上的属性和方法。

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

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

const person = new Person('Alice');

console.log(person.name); // 输出: "Alice"
person.greet(); // 输出: "Hello, my name is Alice"

在上面的示例中,person 实例的 name 属性是通过 this.name = name 语句定义的。.greet() 方法是通过原型继承的,我们可以直接在 person 实例上调用该方法。

.prototype.constructor

每个原型对象都有一个 .constructor 属性,它指向构造函数本身。它提供了一种跟踪对象是通过哪个构造函数创建的方法。

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

const person = new Person('Alice');

console.log(person.constructor); // 输出: [Function: Person]

在上面的示例中,person.constructor 返回了构造函数 Person

总结

JavaScript 中的 .prototype 允许我们为函数对象添加属性和方法,使其可以在该函数的所有实例之间共享。它通过原型链实现了属性和方法的继承。.prototype 还提供了 .constructor 属性,用于指向构造函数本身。

希望本文能为你解答关于 JavaScript .prototype 的问题,让你更好地理解它是如何工作的。