这对你来说听起来不是很尴尬吗?这个定义有意义吗?对于我来说,在这两种情况下都使用了一个构造函数(使用new可以覆盖返回的对象)并且在两种情况下都有一个原型继承。我错过了什么或上面的定义不是很准确吗?
* 3。经典继承和原型继承之间有什么区别?
类继承:实例从类继承(如蓝图 - 类的描述),并创建子类关系:分层类分类法。实例通常通过带有new
关键字的构造函数进行实例化。类继承可能使用也可能不使用ES6中的class
关键字。
Prototypal Inheritance:实例直接从其他对象继承。实例通常通过工厂函数或Object.create()
实例化。实例可以由许多不同的对象组成,允许容易的选择性继承。*
答案 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?"