返回

原生 JS 原型链揭秘:让对象动起来!

前端

在辽阔的 JavaScript 王国里,原型链就像一根无形的丝线,将一个个对象串联起来,形成一个强大的家族体系。今天,我们踏上原型链的探秘之旅,揭开它让对象活灵活现的奥秘!

原生 JavaScript 中,一切皆对象。当我们创建新对象时,浏览器会自动为其关联一个原型 对象。原型是一个特殊对象,包含该对象类型的所有共有属性和方法。

举个例子,我们用 new Object() 创建一个新对象 obj。此时,obj 的原型就是 Object.prototype,其中包含了所有对象的共有方法,如 toString()valueOf()

原型继承的奇妙之处

现在,我们来点精彩的。当我们访问 obj 中不存在的属性或方法时,JavaScript 就会沿着原型链向上查找,逐级寻找匹配项。如果找到了,则使用该属性或方法;如果没有,则返回 undefined

这正是 JavaScript 实现继承的秘密武器!子对象可以继承父对象的属性和方法,就像家族传承一般。例如,我们可以创建 Person 构造函数,并为其添加 name 属性:

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

然后创建 Employee 构造函数,并让其继承 Person

function Employee(name, salary) {
  // 调用 Person 构造函数,将 name 传递给父级
  Person.call(this, name);

  this.salary = salary;
}

通过这种方式,Employee 对象可以访问 Person 原型中的 name 属性,同时拥有自己的 salary 属性。

多态的奥义

原型链还为多态编程铺平了道路。多态指的是对象可以以不同的方式响应相同的消息,就像同一个方法在不同对象上表现出不同的行为。

例如,我们可以在 Person 原型中添加 greet() 方法:

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

此时,所有 Person 的后代对象(如 Employee)都可以调用 greet() 方法:

const employee1 = new Employee("John", 5000);
employee1.greet(); // 输出:"Hello, my name is John"

通过原型链,JavaScript 实现了多态,让对象根据自己的类型展现独一无二的行为。

结语

原型链在 JavaScript 中发挥着至关重要的作用,为对象提供了继承和多态的能力。了解原型链的运作原理,将帮助你编写更灵活、更强大的代码。在编程的道路上,愿你尽情探索原型链的奥秘,让你的代码舞动起来!