返回

看图了解函数、实例(对象)、原型之间的关系

前端

在 JavaScript 中,函数、实例(对象)和原型之间存在着密切的关系。

我们先来看一张图:

[图片]

这张图形象地解释了函数、实例(对象)和原型之间的关系。

图中,函数(Function)是一个蓝色的圆圈,它代表了一个 JavaScript 函数。实例(Object)是一个绿色的圆圈,它代表了一个 JavaScript 对象。原型(Prototype)是一个红色的圆圈,它代表了一个 JavaScript 原型对象。

函数(Function)有一个 prototype 属性,指向另一个对象,这个对象就叫函数的原型对象。实例(Object)也有一个 prototype 属性,指向函数的原型对象。

也就是说,每个函数都有一个 prototype 属性,指向另一个对象,这个对象就叫函数的原型对象。由构造函数产生的实例对象,其 [[Prototype]] 内部属性指向构造函数的 prototype 属性所指向的那个原型对象。

我们可以用代码来验证这一点:

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

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

const person1 = new Person('John');

console.log(person1.prototype); // undefined
console.log(person1.__proto__); // Person {}
console.log(Person.prototype); // Person {}

输出结果为:

undefined
Person {}
Person {}

从输出结果可以看出,person1 的 prototype 属性为 undefined,这是因为实例对象没有 prototype 属性。person1 的 proto 属性指向 Person 的 prototype 属性所指向的对象,即 Person 的原型对象。Person 的 prototype 属性指向 Person 的原型对象,即 Person 的原型对象。

函数(Function)、实例(Object)和原型(Prototype)之间的关系可以用以下几点来总结:

  • 每个函数都有一个 prototype 属性,指向另一个对象,这个对象就叫函数的原型对象。
  • 由构造函数产生的实例对象,其 [[Prototype]] 内部属性指向构造函数的 prototype 属性所指向的那个原型对象。
  • 实例对象没有 prototype 属性。
  • 实例对象的 proto 属性指向函数的原型对象。
  • 函数的 prototype 属性指向函数的原型对象。

理解了函数(Function)、实例(Object)和原型(Prototype)之间的关系,对于理解 JavaScript 的面向对象编程非常重要。