当前位置: 首页 > 面试题库 >

基于原型与基于类的继承

彭星津
2023-03-14
问题内容

在JavaScript中,每个对象同时是一个实例和一个类。要进行继承,可以将任何对象实例用作原型。

在Python,C ++等中,有类和实例作为单独的概念。为了进行继承,您必须使用基类创建一个新类,然后可以使用该新类来生成派生实例。

为什么JavaScript朝这个方向发展(基于原型的面向对象)?与传统的基于类的OO相比,基于原型的OO有哪些优点和缺点?


问题答案:

这里大约有一百个术语问题,大多数是围绕某人(不是您)试图使他们的想法听起来像是“最好的”。

所有面向对象的语言都必​​须能够处理以下几个概念:

  1. 数据封装以及对数据的关联操作,除其他外,各种操作被称为数据成员和成员函数,或者称为数据和方法。
  2. 继承性,可以说这些对象就像其他对象集一样,但这些更改除外
  3. 一个对象的多态性(“许多形状”),它可以自己决定要运行的方法,以便您可以依靠语言正确地路由请求。

现在,就比较而言:

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

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

在“基于类”的语言中,复制发生在编译时。在原型语言中,操作存储在原型数据结构中,并在运行时进行复制和修改。但是,抽象地讲,一个类仍然是共享相同状态空间和方法的所有对象的等效类。在原型中添加方法时,实际上是在制作新的等效类的元素。

现在,为什么呢?主要是因为它在运行时提供了一种简单,逻辑,优雅的机制。现在,要创建一个新对象
创建一个新类,您只需要执行一个深层复制,即复制所有数据和原型数据结构。然后,您或多或少可以免费获得继承和多态性:方法查找 始终
包括按名称向字典请求方法实现。

最终以Javascript /
ECMA脚本结尾的原因基本上是,当我们在10年前开始使用该技术时,我们所使用的功能却差强人意的计算机和复杂得多的浏览器都需要处理。选择基于原型的方法意味着解释器可能非常简单,同时保留了面向对象的理想特性。



 类似资料:
  • 假设我已经包装了我的C类和,并且可以通过SWIG生成的模块从Python访问它们: 在Python中,我创建了面向用户的类,它是一个浅层代理,主要添加docstring,并允许IDE对参数名称进行制表符补全: 问题在于,返回类型为,它没有docstring,也不显示参数名称(swig将所有参数公开为)。相反,我希望它提供我自己的浅代理

  • 长话短说:java.io包中有多少种基于数据流的流?它们是字节流和字符流还是二进制流和字符流? 完整问题: https://youtu.be/v1_ATyL4CNQ?t=20m5s昨天看了本教程后跳到20:05,我的印象是基于数据流有两种类型的流:BinaryStreams和CharacterStreams。今天,在了解了更多关于这个主题的知识之后,我的新发现似乎与旧发现相矛盾。 互联网上的大多数

  • 我有一个现有的C#泛型类,希望根据使用的类型添加或删除一个方法,我解释道 对于特定的

  • 本文向大家介绍基于js中的原型(全面讲解),包括了基于js中的原型(全面讲解)的使用技巧和注意事项,需要的朋友参考一下 在讲js的原型之前,必须先了解下Object和Function。 Object和Function都作为JS的自带函数,Object继承自己,Funtion继承自己,Object和Function互相是继承对方,也就是说Object和Function都既是函数也是对象。 Objec

  • 问题内容: 我正在用Java编写一个Kafka流应用程序,该应用程序将接受由连接器创建的输入主题,该连接器将模式注册表和avro用于键和值转换器。连接器产生以下架构: 实际上,有几个主题,键模式始终是“ int”,而值模式始终是某种记录(用户,产品等)。我的代码包含以下定义 最初,我尝试使用类似的内容来使用该主题, Consumed.with(Serdes.Integer(), userSerde