面向对象和基于对象的语言之间的核心差异

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

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

我看了很多post,所有人都说了两件事

  1. 面向对象语言支持OOP的所有function,而基于对象的语言不支持多态性和inheritance等OOP的所有function。

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

喜欢这篇stackoverflow的post

面向对象和基于对象的语言之间的差异

但我想知道这两个概念之间的核心区别是什么,无论使用何种语言。

得到了答案

终于搞定了

感谢Matías Fidemraizer

答案不依赖于任何语言,不依赖于任何特征,我所嘲笑的核心差异是

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

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

它可以从构造函数构建实际对象,它几乎具有任何对象可能具有的任何function:

  • 构造函数。
  • 方法(即JavaScript中的函数)。
  • 属性(因为ECMA-Script 5,“getters / setters”)。
  • 实例。

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

 var constructor = function() { }; constructor.prototype.text = "hello world"; alert(new constructor().text); // This alerts hello world 

为什么JavaScript不是面向对象的编程(脚本)语言 ? 因为它没有符合面向对象编程定义要求的function:

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

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

更新和摘要

核心差异是面向对象的编程语言具有面向对象范例必须具有的特征,以便被认为是面向对象的编程语言。 因此,JavaScript目前不是一种实际的面向对象编程语言,因为它缺乏实际的多态性和inheritance

更新:ES2015及以上版本是否改变了这种情况?

说实话,是的,ES2015及以上版本有一个重大改进,可以考虑一个不完全但更接近面向对象的编程:语法糖来调用超类

例如:

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

这是多态性 。 更专业的类可以覆盖其基类,以完全更改函数行为或执行基本已经执行的操作,向函数添加新代码。

BTW,ES2015及以上版本仍缺乏真正的封装: 这里的访问修饰符如private还是public 无处

并且,在一天结束时,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语言!

基于对象的语言基本上包括任何提供轻松创建和使用对象的内置function的语言。 有一个主要标准:

  • 封装。 对象具有附加到它们的API,通常以这样的方式使您通过告诉它要做什么而不是通过在对象上运行某些函数更好地处理对象。

    大多数基于对象的语言根据“类”定义对象,这些对象基本上是蓝图。 该类列出了对象的内部结构并定义了API。

    不过,这不是唯一的方法。 例如,在JavaScript中,对象实际上没有“类”。 任何对象都可以拥有它想要的任何属性。 由于函数是JavaScript中的第一类值,因此可以将它们设置为对象的属性,并充当对象的API。

对于基于对象但非面向对象的语言,一个很好的例子是Visual Basic(不是.net的东西;我说的是VB6和VBA)。 类存在,但不能相互inheritance。

面向对象语言是基于对象的语言,它们更进一步。 他们内置了对OOP其他两个支柱的支持:

  • 遗产。 对象必须能够(并被视为)某些其他对象的特化。 这意味着,例如,能够将“狗”定义为“可以吠叫和取棒的动物”。

    在现代语言中,它通常采用从另一个对象的inheritance的一个对象类的forms 。 但这不是必要条件; 与某些人试图告诉你的相反,OOP的定义根本不需要类。

  • 多态性。 代码必须能够使用对象而不知道或关心它究竟是什么类型。

    大多数语言(特别是静态类型的语言)根据类和inheritance来定义多态性。 如果你有一个inheritance自A的B类,那么需要引用A的代码通常可以取一个B,而不是一些与A无关的C类.Java也有interface关键字,可以让你定义一个类必须实现的一组行为。 其类显式implements X并因此实现在接口X上定义的函数的任何对象都有资格作为类型X的实例。

    其他语言(如JavaScript)允许您传递任何您喜欢的对象。 只要对象呈现正确的界面,它究竟是什么类型的对象并不重要。 这被称为“鸭子打字”,它几乎是最纯粹的多态forms。

仅使用对象并不意味着你正在进行OOP,即使是在完全OO语言中,如果你没有实现OO技术,它只是基于对象的编程。

编程语言必须符合4个主要元素才能成为真正的面向对象语言。 它们是:抽象,封装,模块化和层次结构。

但是,如果支持第一个元素,我们可以调用语言对象。 一旦编程语言支持Object的概念,它本身就支持前三个元素,因为它们是Object的固有特性。

JavaScript作为一种语言不能说是面向对象而是基于对象的语言,因为它不支持层次结构(尤其是inheritance)。

OOP和OBP是编程语言的类型遵循不同的原则。

OOP :遵循多态性,inheritance和封装(PIE)。

  • 示例 :Java,.Net等。 与OBP相比,OOP是新的

OBP :遵循多态和封装。

  • 示例 :Ada,Visual Basic(VB)和Fortran 90. OBP已经过时了

面向对象的编程语言遵循属于OOP的所有概念。

基于对象的编程语言具有内置的对象,因此不需要创建对象,它也遵循OOP概念,除了inheritance,

面向对象的语言

 Object-orientd language supports all the features of OOPs Object-orientd language does not has in-built object Object-orientd languages are C++, C#, Java etc 

基于对象的语言

 Object-based language doesn't support all the features of OOPs like Polymorphism and Inheritance Object-based language has in-built object like JavaScript has window object. Object-based languages are JavaScript, VB etc. 

希望,这将澄清你的疑问。