重学 JS 系列:继承追根溯源,找准问题关键
2023-10-30 09:24:04
继承,一直是 JavaScript 学习者遇到的第一个拦路虎,似乎与其他编程语言略有不同,其实只要理解了原理,便可将其彻底驯服。
继承的本质:一种连接关系
从最本质上说,继承就是对象与对象之间的一种连接关系,也就是让一个对象可以访问和使用另一个对象的属性和方法。
实现继承的秘密武器:原型链
在 JavaScript 中,继承的实现依靠原型链,即通过 proto 属性将对象连接起来,形成一条链条,称为原型链。当一个对象无法在自身找到某个属性或方法时,就会沿着原型链一层层向上查找,直到找到这个属性或方法,或者到达链条的顶端——Object 对象。
一个形象的比喻:原型链就是家谱
如果您把对象比作人,那么原型链就是家谱。每个对象都有一个原型对象,原型对象又可以有它的原型对象,以此类推,直到原型链的顶端——Object 对象。一个对象可以访问和使用其原型对象及其以上所有原型对象中的属性和方法,就像子孙可以继承祖先的财产和能力一样。
原型链上的查找顺序
查找属性或方法的顺序是沿着原型链从下往上依次查找,也就是先在自身查找,找不到再找原型对象,再找不到再找原型对象的原型对象,依此类推,直到找到或者到达 Object 对象。
举个例子:
const person = {
name: 'John',
age: 30,
};
const student = {
__proto__: person,
major: 'Computer Science',
};
const john = {
__proto__: student,
hobby: 'coding',
};
console.log(john.name); // John
console.log(john.age); // 30
console.log(john.major); // Computer Science
console.log(john.hobby); // coding
在这个例子中,john 对象通过原型链继承了 person 对象和 student 对象的属性和方法。当我们访问 john 对象的属性或方法时,JavaScript 引擎会沿着原型链查找,直到找到该属性或方法,或者到达 Object 对象。
理解继承的意义:对象复用
继承的意义在于对象复用,即通过创建一个新的对象并继承另一个对象,可以轻松地创建具有相似属性和方法的对象,无需重复编写代码。
关于继承的误区:并非万能
继承并非万能,在某些情况下,使用组合更合适,即创建一个新的对象,并通过该对象访问另一个对象。继承和组合都是对象复用的有效方式,具体选择哪种方式取决于具体情况。
总结:理解继承原理,轻松驾驭 JS 编程
继承是 JavaScript 中一个重要的概念,也是面向对象编程的基础。通过理解继承的原理,您可以更好地理解 JavaScript 的面向对象机制,并轻松驾驭 JS 编程。