返回

JavaScript 原型链(constructor、prototype、[[prototype]])本质和关系

前端

前言

JavaScript 原型链是 JavaScript 中一项重要的概念,它可以帮助我们理解 JavaScript 中的对象是如何工作的。在这篇文章中,我们将探讨 JavaScript 原型链中 constructor、prototype 和 [[prototype]] 的本质和关系,以及如何在原型链中实现继承。

原型链的本质

构造函数 constructor

构造函数是用来创建对象的函数,例如:

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

当我们使用 new 操作符调用构造函数时,就会创建一个新的对象,该对象的 prototype 属性指向构造函数的 prototype 属性,也就是说,对象的 prototype 属性指向构造函数的原型对象。

原型对象 prototype

原型对象是构造函数的属性,它是一个普通对象,通常用于存储该构造函数下所有实例的共享属性和方法。例如:

Person.prototype.sayHello = function() {
  console.log("Hello, my name is " + this.name);
};

当我们访问对象的属性或方法时,如果对象本身没有该属性或方法,那么 JavaScript 会沿着原型链向上查找,直到找到该属性或方法。

隐式原型链 [[prototype]]

每个对象都有一个隐式原型链,它是一个指向其原型对象的指针,我们可以通过 Object.getPrototypeOf() 方法获取对象的隐式原型链。例如:

const person = new Person("John");
const personPrototype = Object.getPrototypeOf(person);
console.log(personPrototype === Person.prototype); // true

原型链中的继承

在 JavaScript 中,我们可以通过原型链实现继承。例如:

function Student(name, school) {
  Person.call(this, name);
  this.school = school;
}

// 在 Student.prototype 上添加 saySchool 方法
Student.prototype.saySchool = function() {
  console.log("I study at " + this.school);
};

// 让 Student 继承 Person
Student.prototype.__proto__ = Person.prototype;

现在,Student 构造函数继承了 Person 构造函数,我们可以通过 new 操作符创建 Student 对象,并访问 Student 对象的属性和方法,包括从 Person 构造函数继承的属性和方法。

结语

在本文中,我们探讨了 JavaScript 原型链中 constructor、prototype 和 [[prototype]] 的本质和关系,以及如何在原型链中实现继承。我们了解到,原型链是 JavaScript 中实现对象继承的一种机制,它可以帮助我们创建更复杂的对象结构。