JavaScript中class继承之后父级和子级原型的关系

本文详细探讨了JavaScript中类的继承机制,通过具体实例解释了如何通过类继承实现原型链的连接,以及new操作符创建对象时原型链的传递过程。
class Component {}
class Greeting extends Component {}

上面的例子,Greeting继承Component意味着

一. Greeting.__proto__ ===  Component

二. Greeting.prototype.__proto__ === Component.prototype

也就是说 new Greeting().__proto__.proto__ ===  Component.prototype

new Greeting().__proto__.__proto__ ===  new Component().__proto__

### 组合与继承的优缺点对比 #### 继承的优点 继承是一种类与类之间的“is-a”关系,它允许子类复用父类的属性方法,从而实现代码的重用。继承的优点之一是子类可以自动获得父类的接口,调用子类时不需要纠结方法命名,可以实现多态,代码显得更简洁[^3]。 #### 继承的缺点 继承的一个显著缺点是其导致的紧耦合性。父类内部对子类是公开的,如果父类发生了变化,所有子类都会受到影响,这可能导致代码的不安全性维护困难[^3]。此外,继承可能导致类层次结构复杂化,特别是在多重继承的情况下,增加了系统的复杂性理解难度。 #### 组合的优点 组合是一种类与类之间的“has-a”关系,它通过将一个类的对象作为另一个类的成员变量来实现功能的复用。组合的一个显著优势在于其灵活性解耦性。与继承不同,组合允许在运行时动态地替换对象的实现,从而实现行为的动态变化。此外,组合避免了继承可能导致的类层次结构复杂化,使得系统更容易维护扩展[^2]。 组合还提供了一种黑箱复用(black-box reuse)的方式,因为对象的内部细节是不可见的。组合类之间没有很强的依赖关系,被包含对象与容器对象之间的依赖关系比较少,优先使用对象组合有助于保持每个类被封装。这种耦合度低的设计有助于代码的维护。 #### 组合的缺点 尽管组合提供了更高的灵活性,但它也可能带来更高的代码复杂度。组合可能需要更多的代码来管理对象之间的关系,并且需要良好的接口设计以确保组件之间的交互顺畅。 #### 组合与继承的实际应用 在实际应用中,结合组合继承的优点、寄生继承的优点,目前JavaScript继承中使用的都是这个继承方法。组合继承的缺点是两次调用父构造函数,一次是在创建原型时,另一次是在构造函数内部,而这个缺点可以通过寄生继承的特性来优化,减少一次调用父构造函数,也就是继承构造函数的原型来创建原型[^1]。 #### 示例代码 下面是一个使用组合的例,展示了如何通过组合来实现功能复用: ```java /** * CPU */ public class CPU { public void process() { System.out.println("CPU 处理数据..."); } } /** * 内存 */ public class Memory { public void store() { System.out.println("内存存储数据..."); } } /** * 硬盘 */ public class HardDrive { public void readWrite() { System.out.println("硬盘读写数据..."); } } /** * 计算机 */ public class Computer { private CPU cpu; private Memory memory; private HardDrive hardDrive; public Computer() { this.cpu = new CPU(); this.memory = new Memory(); this.hardDrive = new HardDrive(); } public void run() { cpu.process(); memory.store(); hardDrive.readWrite(); } public static void main(String[] args) { Computer computer = new Computer(); computer.run(); // 通过组合调用各个组件的方法 } } ``` 在上述代码中,`Computer` 类通过组合的方式包含了 `CPU`、`Memory` `HardDrive` 的实例。这种设计使得 `Computer` 可以灵活地使用这些组件的功能,同时避免了继承可能导致的紧耦合问题[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值