为了账号安全,请及时绑定邮箱和手机立即绑定

基于原型与基于类的继承

基于原型与基于类的继承

江户川乱折腾 2019-09-18 13:32:48
在JavaScript中,每个对象都是实例和类。要进行继承,可以使用任何对象实例作为原型。在Python,C ++等中,有类和实例作为单独的概念。为了进行继承,您必须使用基类来创建一个新类,然后可以使用它来生成派生实例。为什么JavaScript会朝这个方向发展(基于原型的面向对象)?基于原型的OO相对于传统的,基于类的OO有哪些优点(和缺点)?
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

这里有大约一百个术语问题,主要是围绕某人(不是你)试图让他们的想法听起来像The Best。

所有面向对象的语言都需要能够处理几个概念:

  1. 封装数据以及对数据的相关操作,不同地称为数据成员和成员函数,或者作为数据和方法等。

  2. 继承,能够说这些对象就像其他一组对象一样,除了这些变化之外

  3. 多态(“多种形状”),其中一个对象自己决定要运行哪些方法,以便您可以依赖语言来正确地路由您的请求。

现在,就比较而言:

首先是整个“阶级”与“原型”问题。这个想法最初开始于Simula,其中使用基于类的方法,每个类表示一组共享相同状态空间(读取“可能值”)和相同操作的对象,从而形成等价类。如果你回顾一下Smalltalk,因为你可以打开一个类并添加方法,这实际上与你在Javascript中可以做的一样。

后来的OO语言希望能够使用静态类型检查,因此我们在编译时得到了固定类集的概念。在开放阶段版本中,您具有更大的灵活性; 在较新的版本中,您可以在编译器上检查某些类型的正确性,否则需要进行测试。

在“基于类”的语言中,复制发生在编译时。在原型语言中,操作存储在原型数据结构中,在运行时复制和修改。但是,抽象地说,类仍然是共享相同状态空间和方法的所有对象的等价类。当您向原型添加方法时,您将有效地创建新等价类的元素。

现在,为什么这样做?主要是因为它在运行时创建了一个简单,合理,优雅的机制。现在,要创建新对象创建新类,您只需执行深层复制,复制所有数据和原型数据结构。您可以或多或少地免费获得继承和多态性:方法查找总是包括通过名称向字典询问方法实现。

最终出现在Javascript / ECMA脚本中的原因基本上就是当我们10年前开始使用它时,我们处理的是功能较弱的计算机和不太复杂的浏览器。选择基于原型的方法意味着解释器可以非常简单,同时保留面向对象的理想属性。


查看完整回答
反对 回复 2019-09-18
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

你应该看看Douglas Crockford写的一本关于JavaScript的好书。它为JavaScript创建者所做的一些设计决策提供了很好的解释。

JavaScript的一个重要设计方面是其原型继承系统。对象是JavaScript中的一等公民,以及常规函数也被实现为对象('Function'对象是精确的)。在我看来,当它最初设计为在浏览器中运行时,它意味着用于创建大量的单例对象。在浏览器DOM中,您可以找到窗口,文档等所有单例对象。此外,JavaScript是松散类型的动态语言(与强类型的动态语言Python相反),因此,通过使用'prototype'属性实现了对象扩展的概念。

所以我认为在JavaScript中实现了基于原型的OO的一些优点:

  1. 适用于松散类型的环境,无需定义显式类型。

  2. 使单例模式变得非常容易(在这方面比较JavaScript和Java,你会知道我在说什么)。

  3. 提供在不同对象的上下文中应用对象的方法,从对象等动态添加和替换方法的方法(在强类型语言中不可能的事情)。

以下是原型OO的一些缺点:

  1. 没有简单的方法来实现私有变量。可以使用Crockford的魔法使用闭包来实现私有变量,但它绝对不像在Java或C#中使用私有变量那么简单。

  2. 我不知道如何在JavaScript中实现多重继承(其价值)。


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 481 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号