gpt4 book ai didi

javascript - 经典与原型(prototype)继承

转载 作者:行者123 更新时间:2023-12-03 13:23:48 29 4
gpt4 key购买 nike

在阅读了两者之后,我只是好奇,编程社区如何使用它?
在什么情况下?

最佳答案

经典继承存在很多原型(prototype)继承不存在的问题,例如:

古典传承

紧耦合。继承是面向对象设计中可用的最紧密耦合。后代类对其祖先类有深入的了解。

不灵活的层次结构(也就是必要的重复)。单亲层次结构很少能够描述所有可能的用例。最终,所有层次结构对于新用途都是“错误的”——这是一个需要重复代码的问题。

多重继承很复杂。通常希望从多个 parent 那里继承。该过程异常复杂,其实现与单继承过程不一致,这使得阅读和理解变得更加困难。

脆弱的建筑。由于紧密耦合,通常很难用“错误”的设计重构一个类,因为很多现有的功能都依赖于现有的设计。

gorilla /香蕉问题。通常,您不想继承父级的某些部分。子类化允许您覆盖父级的属性,但不允许您选择要继承的属性。

原型(prototype)继承

要了解原型(prototype)继承如何解决这些问题,首先应该了解原型(prototype)继承有两种不同类型。 JavaScript 同时支持:

代表团。如果在实例上找不到属性,则在实例的原型(prototype)上搜索它。这使您可以在多个实例之间共享方法,免费为您提供享元模式。

级联。向对象动态添加属性的能力使您可以自由地将任何属性从一个对象复制到另一个对象,全部复制或有选择地复制。

您可以结合两种形式的原型(prototype)继承来实现非常灵活的代码重用系统。实际上非常灵活,使用原型(prototype)实现经典继承是微不足道的。反过来是不正确的。

原型(prototype)继承允许您在经典语言中找到的大多数重要特性。在 JavaScript 中,闭包和工厂函数允许您实现私有(private)状态,并且函数继承可以很容易地与原型(prototype)相结合,以便添加支持数据隐私的 mixin。

原型(prototype)继承的一些优点:

松耦合。实例永远不需要直接引用父类或原型(prototype)。可以存储对对象原型(prototype)的引用,但不建议这样做,因为这会促进对象层次结构中的紧密耦合——这是经典继承的最大缺陷之一。

扁平的层次结构。使用原型(prototype) OO 来保持继承层次结构平坦是微不足道的 - 使用连接和委托(delegate),您可以拥有单级对象委托(delegate)和单个实例,而无需引用父类。

微不足道的多重继承。从多个祖先继承就像使用串联组合来自多个原型(prototype)的属性以形成新对象或新对象的新委托(delegate)一样简单。

灵活的架构。由于您可以使用原型(prototype) OO 选择性地继承,因此您不必担心“错误设计”问题。新类可以从任何源对象组合继承任何属性组合。由于层次结构扁平化很容易,一个地方的变化并不一定会在一长串后代对象中引起涟漪。

没有 gorilla 了。选择性继承消除了 gorilla 香蕉问题。

我不知道经典继承比原型(prototype)继承有什么优势。如果有人知道,请赐教。

关于javascript - 经典与原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1450582/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com