35

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

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

我读过很多帖子,他们都在说两件事

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

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

喜欢stackoverflow的这篇文章

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

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

得到了答案

终于拿到东西了

谢谢Matías Fidemraizer

答案不依赖于任何语言,不依赖于任何功能,我正在寻找的核心区别是

本身包含对象的语言称为基于对象的语言,遵循面向对象概念的语言称为面向对象语言

4

8 回答 8

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

为什么 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!");
     }
}

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

顺便说一句,ES2015 及更高版本仍然缺乏真正的封装:访问修饰符 likeprivatepublichere 在哪里? 无处

而且,归根结底,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 视为另一种完全支持面向对象编程的语言!

于 2013-03-15T10:50:23.750 回答
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,可以让你传递任何你喜欢的对象。只要对象呈现正确的界面,它到底是什么类型的对象并不重要。这被称为“鸭子类型”,它几乎是最纯粹的多态形式。

于 2013-07-12T22:44:01.557 回答
4

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

于 2013-07-12T18:32:09.987 回答
0

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

但是,如果支持第一个存在元素,我们可以调用基于语言对象。一旦编程语言支持对象的概念,它就本质上支持前三个元素,因为它们是对象的固有特征。

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

于 2014-10-09T10:00:44.633 回答
0

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

OOP:遵循多态、继承和封装(PIE)。

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

OBP:遵循多态性和封装。

  • 示例:Ada、Visual Basic (VB) 和 Fortran 90。OBP 已过时
于 2015-07-24T03:49:18.203 回答
0

粗略...

  • 面向对象:支持封装、继承、多态
  • 基于对象:支持封装

维基百科 - 基于对象的语言

于 2019-01-01T19:42:22.260 回答
-3

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

基于对象的编程语言具有 ibuilt 对象,因此无需创建对象,并且它还遵循 OOP 概念,除了继承,

于 2015-10-12T09:38:11.130 回答
-3

面向对象语言

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.

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

于 2016-05-05T10:24:35.343 回答