首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >面向对象语言与基于对象语言的核心区别

面向对象语言与基于对象语言的核心区别
EN

Stack Overflow用户
提问于 2013-03-15 10:30:38
回答 8查看 88.2K关注 0票数 36

我想知道在

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

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

  1. 面向对象的语言支持OOPs的所有特性,而基于对象的语言不支持OOPs的所有特性,如多态性和继承。
  2. 他们给出了基于对象的javascript和面向对象的java的示例。

像这个堆叠溢出的帖子

面向对象语言与基于对象语言的区别

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

得到答案

终于得到了

多亏了Matías Fidemraizer

答案不依赖于任何语言,也不依赖于任何特征,这是我所寻找的核心区别。

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-03-15 10:50:23

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

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

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

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

代码语言:javascript
运行
复制
var constructor = function() { };
constructor.prototype.text = "hello world";

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

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

  • Polymorphism:号您可以更改原型成员的行为,但这只是重复使用标识符。您无法访问伪派生对象中成员的先前实现。
  • Inheritance:一点也不。也许原型链可以与继承相媲美,但是JavaScript (ECMA-Script5.x或更早版本)没有其他基于OOP的语言那样基于语法的继承(即Java、C#、Ruby、VisualBasic.NET、.)。
  • Encapsulation.是的,当然,但是没有办法创建实际的私有或内部对象成员。

也许我忘了提及其他细节,但我真的认为这是一个很好的总结。

更新和摘要

其核心区别在于,面向对象的编程语言具有面向对象范式为被认为是面向对象的编程语言而必须具备的特性。因此,就目前而言, JavaScript并不是一种实际的面向对象的编程语言,因为它缺乏实际的多态性和继承

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

从美学上说,是的,ES2015和更高版本有一个重大的改进,让我们考虑一个不完全但更接近面向对象编程的方面:调用超类的语法糖。

例如:

代码语言:javascript
运行
复制
class A {
     doStuff() {
         console.log("hello world");
     }
}

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

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

顺便说一下,ES2015和更高版本仍然缺乏真正的封装:访问修饰符(如 public )在哪里?哪里都没有。

最后,ES2015和以上实现了基于类的OOP,但它仍然是ECMAScript 5.x之上的一个语法糖层.上面的代码仍然与引擎盖下的原型一起工作,其工作方式与在ECMAScript 5.x中编写它的方式相同:

代码语言:javascript
运行
复制
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另一种完全支持面向对象编程的语言!

票数 25
EN

Stack Overflow用户

发布于 2013-07-12 22:44:01

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

  • Encapsulation.对象附带了一个API,通常是通过告诉对象应该做什么而不是在对象上运行一些函数来处理对象。 大多数基于对象的语言根据“类”定义对象,这些类基本上是对象的蓝图。该类列出了对象的内部结构并定义了API。 不过,这不是唯一的办法。例如,在JavaScript中,对象实际上没有“类”。任何对象都可以拥有它想要的任何属性。由于函数是JavaScript中的第一类值,所以可以将它们设置为对象的属性,并充当对象的API。

就基于对象但不是面向对象的语言而言,一个很好的例子是Visual (不是.net,而是VB6和VBA)。类存在,但不能相互继承。

Object-oriented语言是一种基于对象的语言,它更进一步。它们为OOP的其他两大支柱提供了内置支持:

  • Inheritance.对象必须具有(并被视为)其他对象的专门化能力。这意味着,例如,能够将“狗”定义为“能够吠叫和取枝的动物”。 在现代语言中,它通常采取一个对象的类继承另一个对象的类的形式。然而,这不是一个要求;与一些人试图告诉您的相反,OOP的定义根本不需要类。
  • Polymorphism.代码必须能够在不知道或不关心对象类型的情况下使用对象。 大多数语言(特别是静态类型化语言)从类和继承的角度定义多态性。如果您有一个继承自A的类B,则需要引用A的代码通常可以采用B,但与A无关的C类通常不会使用interface关键字,它允许您定义类必须实现的一组行为。 其他语言,比如JavaScript,可以传递任何你喜欢的对象。只要对象显示正确的接口,它到底是什么类型的对象并不重要。这被称为“鸭子类型”,它几乎是最纯粹的多态性形式。
票数 18
EN

Stack Overflow用户

发布于 2013-07-12 18:32:09

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15430004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档