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

7
我在这里找到了这个定义:https://medium.com/javascript-scene/10-interview-questions-every-javascript-developer-should-know-6fa6bdf5ad95#.y0nc8kx34。你认为这个定义听起来有些别扭吗?这个定义对你来说有没有意义?对我来说,在两种情况下都使用了构造函数(使用new可以覆盖返回的对象),并且在两种情况下都存在原型继承。我是漏掉了什么还是上面的定义不太准确?
3. 经典继承和原型继承有什么区别?
经典继承:实例从类中继承(像蓝图一样 - 类的描述),并创建子类关系:层次结构类分类法。通常使用带有“new”关键字的构造函数实例化实例。类继承可能会或可能不会使用ES6中的“class”关键字。
原型继承:实例直接从其他对象继承。通常使用工厂函数或Object.create()实例化实例。实例可以由许多不同的对象组成,允许进行轻松选择性继承。

这完全不正确。即使在ES6中使用class语法,它仍然是原型继承。区别不在于使用的声明语法,而在于实际运行方式。 - jfriend00
好的,它确实说“通常”。但是在JS中没有经典继承,只有隐藏原型继承的语法。 - MinusFour
我知道。我感觉作者并不真正理解JavaScript继承是如何工作的,而是将其与其他更典型的面向对象语言的知识混淆了,但在责怪他之前,我想确定我没有漏掉任何东西。 - François Richard
1
我可以向您保证,Eric Elliot非常了解JS中的继承原理,只是试图通过使用经典继承与其他语言的区别来展示它。在JS中唯一的问题是您无法在类定义内部拥有私有变量,只能通过函数式继承实现,但这会导致每个实例中方法的重复,从而增加内存成本。 - Ahmet Cetin
所以我不明白他想说什么,我的意思是新的使用原型继承。我不理解反对Object.create()和new的观点。 - François Richard
显示剩余3条评论
2个回答

4

“class”和“prototype”之间存在接口语义上的不同。

接口差异

如何在代码中使用它。这篇文章很好地解释了它们之间的区别和好处。

语义差异

无论它在JavaScript中如何实现,我们都可以使用ES6-class强调我们的对象具有“class”含义。原本,“class”是指我们可以将某些对象分类到一个或另一个对象集合中。请参见集合论中的定义:https://en.wikipedia.org/wiki/Class_(set_theory)

此外,类是一些抽象的东西,在我们创建实例之前不存在。

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

“原型”是一组对象中的样本或代表性对象。在这种情况下,我们使用现有原型(创建克隆或链接)来创建新对象。它们也可以成为新对象的原型。

当其他程序员阅读您的代码并看到您选择的是原型还是,他们会期望这些语义含义。


在JavaScript中,“class”和“types”根本不是类似的。程序员期望它们是相似的,这是常见的混淆来源。 - Eric Elliott

3
在JavaScript中,类继承是基于原型继承实现的,但这并不意味着它们做的事情相同:
除了继承属性外,类继承还进行了额外的链接步骤,将子[[Prototype]]连接到父[[Prototype]]。通常也会调用super()构造函数。这些额外的步骤形成了父/子层次结构,并创建了OO设计中可用的最紧密耦合。
因此,“类从类中继承,并创建子类关系:层次类分类法。”
还有一种重要的原型式OO需要了解,那就是拼接继承和原型委托。
拼接继承很重要,因为它允许在JavaScript中进行简单(非常常见的)对象组合。记住四人帮说过,“优先考虑对象组合而不是类继承。”
这是普遍接受的OO设计智慧,由于拼接继承,在JavaScript中做到这一点非常容易。

更多细节请参见"精通JavaScript面试:类和原型继承有什么区别?"


1
谢谢回复!那么,原型继承不会创建到父[[Prototype]]的链接?这意味着我不能使用原型继承创建深层次的类/对象层次结构吗? - Dmitry Yaremenko
关于语义差异的提及怎么样?你同意我的答案吗? - Dmitry Yaremenko
串联继承并不创建类/对象的层次结构。可以使用原型委托来创建这样的层次结构,这也是JavaScript中实现类继承的方式。是的,类和类型之间存在语义差异,我同意您的定义,但需要注意的是,在JavaScript中,**class和类型根本不是类比的**。程序员期望它们是类比的,这是常见的混淆来源。 - Eric Elliott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接