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

时间:2013-03-15 10:30:39

标签: java javascript oop object

我想知道

之间的核心区别是什么

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

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

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

  2. 他们举例说明javascript是基于对象的,java是面向对象的

  3. 喜欢这篇stackoverflow的帖子

    Difference between object oriented and object based language

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

    得到了答案

    终于得到了东西

    感谢Matías Fidemraizer

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

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

8 个答案:

答案 0 :(得分:24)

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

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

  • 构造
  • 方法(即JavaScript中的函数)。
  • 属性(因为ECMA-Script 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语言!

答案 1 :(得分: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)可让您传递任何您喜欢的对象。只要对象呈现正确的界面,它究竟是什么类型的对象并不重要。这被称为“鸭子打字”,它几乎是最纯粹的多态性形式。

答案 2 :(得分:4)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

  

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

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

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

OBP :遵循多态和封装。

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

答案 5 :(得分:0)

粗暴地...

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

Wikipedia - Object-Based Language

答案 6 :(得分:-3)

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

基于对象的编程语言有ibuilt对象,所以不需要创建对象,它也遵循OOP概念,除了继承,

答案 7 :(得分:-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.

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