gpt4 book ai didi

javascript - 基于原型(prototype)与基于类的继承

转载 作者:IT老高 更新时间:2023-10-28 13:14:56 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

现在,就比较而言:

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

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

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

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

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

关于javascript - 基于原型(prototype)与基于类的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/816071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com