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

面向对象和基于对象的语言之间的核心区别

莘睿
2023-03-14
问题内容

我想知道两者之间的核心区别是什么

面向对象和基于对象的语言

我读过很多文章,所有人都说两件事

  1. 面向对象的语言支持OOP的所有功能,而基于对象的语言不支持OOP的所有功能,例如多态和继承。

  2. 他们给出了javascript作为基于对象和java作为面向对象的示例

像这个stackoverflow的帖子

面向对象和基于对象的语言之间的区别

但是我想知道这两种概念之间的核心区别是什么,而与任何语言无关。

得到了答案

终于明白了

谢谢 Matías Fidemraizer

答案不依赖于任何语言,也不依赖于任何功能,我所寻找的核心差异是

本身包含对象的语言称为基于对象的语言,具有以下面向对象概念的语言称为面向对象的语言


问题答案:

JavaScript是一种面向原型的语言。

它可以从构造函数中构建实际对象,并且几乎具有任何对象可能具有的所有功能:

  • 构造函数。
  • 方法(即JavaScript中的函数)。
  • 属性(自ECMA脚本5开始,“ getters / setters”)。
  • 实例。

在JavaScript中,任何对象都有一个 原型 ,包括 functions 。原型本身是将 对象成员
添加到整个对象的任何新创建的实例的基本方法。

var constructor = function() { };
constructor.prototype.text = "hello world";

alert(new constructor().text); // This alerts hello world

为什么JavaScript不是一种面向对象的编程 (脚本)语言 ?因为它没有满足面向对象编程定义要求的功能,所以:

  • 多态性 。您可以更改原型成员的行为,但这只是重用标识符。您无法在 伪派生的对象中 访问该成员的先前实现。
  • 继承 :一点 也不 。也许原型链可以与继承媲美,但是JavaScript(ECMA-Script 5.x或更早版本)没有像其他基于OOP的语言(即Java,C#,Ruby,Python,VisualBasic.NET等)那样基于语法的继承。 )。
  • 封装 。是的,当然可以,但是无法创建实际的私有或内部对象成员。

也许我忘了提及其他细节,但是老实说,我相信这是一个很好的总结。

更新和摘要

核心区别在于,面向对象的编程语言具有必须具有面向对象的范例才能被视为面向对象的编程语言的特征。
因此,JavaScript目前还不是真正的面向对象的编程语言,因为它缺乏实际的多态性和继承性

更新:ES2015及更高版本是否改变了情况?

从美学上讲是的,ES2015及更高版本具有重大改进,可以考虑不完全但更接近于面向对象的编程:调用 超类的 语法糖。

例如:

class A {
     doStuff() {
         console.log("hello world");
     }
}

class B extends A {
     doStuff() {
         super.doStuff();
         console.log("...and goodbye!");
     }
}

这是 多态性 。一个更专业的类可以覆盖其基类,以完全改变函数的行为或执行基类已经在做的事情,向该函数添加新代码。

BTW,ES2015及以上仍然缺乏真正的封装: 哪里都像访问修饰符privatepublic在这里? 无处

而且,归根结底,ES2015及更高版本实现了基于类的OOP,但它仍然是ECMAScript
5.x之上的语法糖层。…上面的代码仍然可以在底层使用原型,并且以相同的方式工作就像您将在ECMAScript 5.x中进行编码一样:

function A() {
}

A.prototype.doStuff = function() {
    console.log("hello world");
};

function B() {
}

B.prototype = Object.create(A.prototype);
B.prototype.doStuff = function() {
    A.prototype.doStuff.call(this);
    console.log("...and goodbye!");
};

希望我需要再次更新此答案,因为ES2020已经提出了访问修饰符,并且我们将能够考虑JavaScript另一种完全支持面向对象编程的语言!



 类似资料:
  • 我想知道两者的核心区别是什么 面向对象和基于对象的语言 我看过很多帖子他们都在说两件事 > 面向对象语言支持OOPs的所有特性,而基于对象的语言不支持OOPs的所有特性,如多态性和继承。 他们给出了基于对象的javascript和面向对象的java的例子 比如这篇stackoverflow的帖子 面向对象语言与基于对象语言的区别 但我想知道,无论使用何种语言,这两个概念之间的核心区别是什么。 找到

  • 问题内容: 面向对象的编程语言和基于对象的编程语言之间有什么区别?JavaScript是面向对象还是基于对象? 问题答案: 维基百科说: 在计算机科学中,基于对象一词具有两种不同的含义: 某种程度上受限的面向对象编程,其中应用了以下一项或多项限制:(a)没有隐式继承,(b)没有多态性,(c)仅可用值的非常少的子集是对象(通常是GUI组件)。 基于原型的系统(即基于“原型”对象的系统,这些对象不是任

  • 问题内容: 您能否简单地解释一下Transfer对象和Domain对象之间的区别?如果您可以举一个Java示例,那就太好了。 问题答案: DTO没有任何逻辑。他们只有字段(州)。在将数据从一个层/子系统传输到另一层/子系统时使用它们 域对象可以具有逻辑(取决于您使用的是域驱动设计还是贫乏的数据模型),并且它们通常与数据库结构相关。 如果使用贫乏的数据模型(即您的域对象没有任何逻辑),则DTO和域对

  • 关于一个语言被称为面向对象所需的功能,在编程社区内并未达成一致意见。Rust 被很多不同的编程范式影响,包括面向对象编程;比如第十三章提到了来自函数式编程的特性。面向对象编程语言所共享的一些特性往往是对象、封装和继承。让我们看一下这每一个概念的含义以及 Rust 是否支持他们。In my view the Gang of Four is the best book ever written on

  • 问题内容: 请说明对象一和对象二的区别: 欧宝级扩展了轿车。 问题答案: 您可以重新分配给的其他某个子类的对象: 但是您不能那样重新分配,因为它仅限于。 如果是在类中定义的方法,而不是在类中定义的方法,则如果这样做,编译器将给您一个错误: 但这没关系: 由于它知道仅限于,因此它知道该方法将存在。 通常,您希望将变量声明为尽可能 广泛的 类型。也就是说,如果您仅要使用中的方法,则请使用type声明它

  • 主要内容:SqlSessionFactoryBuilder,SqlSessionFactory,SqlSessionMyBatis 有三个基本要素: 核心接口和类 MyBatis核心配置文件(mybatis-config.xml) SQL映射文件(mapper.xml) 下面首先介绍 MyBatis 的核心接口和类,如下所示。   每个 MyBatis 应用程序都以一个 SqlSessionFactory 对象的实例为核心。 首先获取 SqlSessionFactoryBuilder 对象,可以