【问题标题】:Javascript Distinguish between Composition vs. InheritanceJavascript 区分组合与继承
【发布时间】:2014-08-08 22:45:30
【问题描述】:

在 classfull-Style (c++) 或传统设计模式 (GofPatterns) 中,组合和继承之间的区别是什么以及如何实现以及何时使用什么(优点/缺点)非常清楚。

但是你如何区分组合或 JS 中的“正常”继承?还是用同一个词?

例如,原型继承是定义为组合还是继承?

你们在想什么?

【问题讨论】:

  • 是JavaScript对继承的实现。它基本上是一个对象的查找链。当您从一个对象请求一个属性时,如果该对象没有它,它会查看其原型链中的下一个对象,依此类推,直到找到该属性或到达链的末尾。许多对象可以并且确实从单个对象继承。
  • ...或者这完全是一个语义问题?您是在问 JavaScript 的原型继承是否也可以描述为组合?
  • 对不起,我问的不是很清楚......谢谢,但我知道原型继承,原型链以及 js 中的 OOP 是如何工作的......是的,你是对的 @cookie 怪物,它的整个语义你定义的问题:)...当有人问我 js 中的组合与继承如何工作时,我可以说原型继承是一种组合方式还是我应该说组合和一般继承之间没有区别(使用 fe 扩展)... 作为工程师,您将如何回答这个问题?
  • 这是一个有趣的问题。我想我从来没有真正听说过在 JS 的上下文中讨论过组合,但我想它的继承模型在某种意义上可以看作是使用组合构建的,因为对象的原型是具有自己属性的单独对象,比如一个隐式链表。但是,在使用“继承”属性时,它们就像是实际对象的一部分一样运行,例如,继承方法中的 this 的值是实际对象而不是方法所有者。所以这一切似乎有点混乱。我想我没有明确的答案。
  • ...我想知道programmers.stackexchange.com/help/on-topic 站点是否更适合解决这个问题。但通常它只是被认为是 JavaScript 的继承模型。

标签: javascript inheritance prototype composition


【解决方案1】:

当我第一次学习 Java 时,我很想尝试用 Javascript 做同样的事情。但这是一个错误的想法。 Javascript 允许进行面向对象编程。使用 Javascript 完成 OOP 的方式与 C++ 或 Java 不同:允许 OOP 的是您使用它的方式,而不是语言本身。

我向您推荐这些链接以正确了解如何使用 Javascript:

http://javascriptissexy.com/how-to-learn-javascript-properly/

http://javascriptissexy.com/learn-intermediate-and-advanced-javascript/

【讨论】:

  • 感谢您的帮助,但我知道 js 中的 OOP 是如何工作的……如果 js 专家和 js 软件工程师区分组合和继承这两个术语,或者他们总是称之为继承,那就更成问题了,无论以何种方式到达
【解决方案2】:

例如,原型继承是否定义为组合或继承?

你们在想什么?

这与我的想法无关,而是语言核心提供了什么……

在 classfull-Style (c++) 或传统设计模式 (GofPatterns) 中,组合和继承之间的区别是什么以及如何实现以及何时使用什么(优点/缺点)非常清楚。

但是你如何区分组合或 JS 中的“正常”继承?还是用同一个词?

……当然,人们不应该过多地扭曲概念。因此,对于 JavaScript 来说,组合和继承与支持这些范式的任何其他 PL 一样重要。 JavaScript 具有 Delegation 功能,它已经启用了 Code-reuse 的两种变体。首先,继承,它在 JavaScript 中被绑定到构造函数的[prototype] 属性的委托自动机制所覆盖。其次,对象组合,它基于通过其中一种调用方法([call][apply])显式委派函数。

总结一下:

  • 原型委托(自动化)== 继承
  • 函数对象的显式委派 == 角色 基于组合概念,例如 MixinsTraits / Talents
  • 将属性从一个对象逐步复制到另一个对象 == 另一种实现 mixin 组合的方式

我已经在另外两个回复中提供了示例……

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 2014-01-17
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2012-06-17
    相关资源
    最近更新 更多