原生 JS 原型链揭秘:让对象动起来!
2023-12-24 22:22:40
在辽阔的 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 中发挥着至关重要的作用,为对象提供了继承和多态的能力。了解原型链的运作原理,将帮助你编写更灵活、更强大的代码。在编程的道路上,愿你尽情探索原型链的奥秘,让你的代码舞动起来!