返回

深入探秘 JavaScript 原型链

前端

万物皆对象:普通对象与函数对象

JavaScript 中,万物皆对象!但对象之间却存在着差异,可分为普通对象和函数对象。Object 和 Function 是 JavaScript 自带的函数对象。

const obj = {}; // 普通对象
const func = function() {}; // 函数对象

原型链:对象之间的连接桥梁

在 JavaScript 中,每个对象都隐式拥有一个名为 proto 的内部属性,该属性指向其原型对象。原型对象也是一个对象,它拥有自己的 proto 属性,以此类推,形成一条对象的链接链,称为原型链。

obj.__proto__ === Function.prototype; // true
func.__proto__ === Function.prototype; // true

构造函数:对象的蓝图

构造函数是用于创建新对象的特殊函数,它通过 new 运算符调用。每个构造函数都有一个 prototype 属性,该属性指向一个对象,该对象作为所有由该构造函数创建的对象的原型。

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

const person = new Person('John');
person.__proto__ === Person.prototype; // true

继承:从原型链中汲取力量

原型链使得 JavaScript 实现继承成为可能。当一个对象从另一个对象继承时,它继承了后者的原型对象中定义的所有属性和方法。

function Employee(name, salary) {
  Person.call(this, name);
  this.salary = salary;
}

Employee.prototype = Object.create(Person.prototype);
const employee = new Employee('Jane', 1000);
employee.__proto__ === Employee.prototype; // true
employee.__proto__.__proto__ === Person.prototype; // true

拓展原型:动态添加属性和方法

可以动态地向原型对象中添加属性和方法,从而扩展所有与其关联的对象的功能。

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

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

理解原型链的重要性

掌握原型链对于理解 JavaScript 至关重要。它解释了以下关键概念:

  • 对象之间的关系和继承
  • 属性和方法的查找机制
  • 如何扩展和修改对象行为

通过深入了解原型链,开发者可以更有效地编写和调试 JavaScript 代码。