经典继承和原型继承之间的区别

时间:2016-01-10 16:07:07

标签: javascript class inheritance prototype ecmascript-6

我在这里找到了这个定义:https://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-6fa6bdf5ad95#.y0nc8kx34

这对你来说听起来不是很尴尬吗?这个定义有意义吗?对于我来说,在这两种情况下都使用了一个构造函数(使用new可以覆盖返回的对象)并且在两种情况下都有一个原型继承。我错过了什么或上面的定义不是很准确吗?

* 3。经典继承和原型继承之间有什么区别?

类继承:实例从类继承(如蓝图 - 类的描述),并创建子类关系:分层类分类法。实例通常通过带有new关键字的构造函数进行实例化。类继承可能使用也可能不使用ES6中的class关键字。

Prototypal Inheritance:实例直接从其他对象继承。实例通常通过工厂函数或Object.create()实例化。实例可以由许多不同的对象组成,允许容易的选择性继承。*

2 个答案:

答案 0 :(得分:4)

“class”和“prototype”之间存在接口语义差异。

界面差异

如何在代码中使用它。文章中很好地解释了差异和好处。

语义差异

无论在javascript中如何实现,我们都可以使用 ES6-class 来强调我们的对象具有“类”含义。最初“类”意味着我们可以 ify某个对象到一个或另一组对象。参见集合论中的定义:https://en.wikipedia.org/wiki/Class_(set_theory)

此外,在创建实例之前,类是抽象的并且不存在。

如果我们谈论类继承 - 理解抽象是很简单的,某些类可以是另一个创建层次结构的类的子类。

原型是来自某些对象集的示例或代表对象。在这种情况下,我们使用现有原型(创建克隆或链接)创建新对象。它们也可以成为新物体的原型。

当其他程序员阅读您的代码并查看您选择的内容 - prototype class 时,他们会期望这些语义含义。

答案 1 :(得分:3)

在JavaScript中,类继承是在原型继承之上实现的,但这并不意味着它做同样的事情:

除了继承属性之外,类继承还需要额外的连线来将子[[Prototype]]链接到父[[Prototype]]。通常,也会调用// assuming two views have outlets: CGRect view1Frame = [view1 frame]; CGRect view2Frame = [view2 frame]; CGRect intersection = CGRectIntersection(view1Frame, view2Frame); if(CGRectIsNull(intersection)) { // Not touching yet - null intersection } else { // Touching! Do something here } 构造函数。这些额外的步骤形成父/子层次结构,并创建OO设计中可用的最紧密耦合。

因此,“类继承自类并创建子类关系:分层类分类法。

了解有多种原型OO也很有用。重要的是,连接继承原型委派

连接继承很重要,因为这是JavaScript中允许简单(和非常常见)对象组合的原因。请记住,四人组说,“赞成对象组成而不是类继承。”

这是普遍接受的OO设计智慧,并且由于串联继承,在JavaScript中执行此操作是轻而易举的。

有关详细信息,请参阅"Master the JavaScript Interview: What's the Difference Between Class and Prototypal Inheritance?"