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

33 javascript java oop object

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

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

我看了很多帖子,所有人都在说两件事

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

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

喜欢这篇stackoverflow的帖子

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

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

得到了答案

终于搞定了

谢谢 Matías Fidemraizer

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

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

Mat*_*zer 25

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

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

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

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

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

alert(new constructor().text); // This alerts hello world
Run Code Online (Sandbox Code Playgroud)

为什么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!");
     }
}
Run Code Online (Sandbox Code Playgroud)

这是多态性.一个更专业的类可以覆盖它的基类,既可以完全改变函数行为,也可以执行基本已经在做的事情,为函数添加新代码.

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!");
};
Run Code Online (Sandbox Code Playgroud)

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


cHa*_*Hao 17

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

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

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

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

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

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

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

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

  • 多态性.  代码必须能够在不知道或关心它的类型的情况下使用对象.

    大多数语言(特别是静态类型的语言)根据类和继承定义多态性.如果你有一个继承自A的B类,那么需要引用A的代码通常可以取B而不是某些与A无关的C类.Java也有interface关键字,它允许你定义一个类必须实现的一组行为.任何明确表示类的对象implements X,从而实现接口X上定义的函数,都可以作为类型X的实例.

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


小智 5

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