当前位置: 首页 > 知识库问答 >
问题:

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

栾烨华
2023-03-14

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

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

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

>

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

    他们给出了基于对象的javascript和面向对象的java的例子

    比如这篇stackoverflow的帖子

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

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

    找到答案了吗

    终于有东西了

    感谢Matías Fidemraizer

    答案不依赖于任何语言,也不依赖于任何特征,我正在寻找的核心区别就是

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

  • 共有3个答案

    佴保臣
    2023-03-14

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

    邴奇逸
    2023-03-14

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

    >

    大多数基于对象的语言用“类”来定义对象,类基本上是对象的蓝图。该类布局了对象的内部结构,并定义了应用编程接口。

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

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

    面向对象语言是一种基于对象的语言,它使事情更进一步。它们对OOP的另外两个支柱提供了内置支持:

    >

  • 继承权。对象必须具有成为(并被视为)其他对象的专门化的能力。这意味着,例如,能够将“狗”定义为“能吠叫和拿棍子的动物”。

    在现代语言中,它通常采取一个对象的类继承另一个对象的类的形式。然而,这不是一个要求;与一些人试图告诉你的相反,面向对象编程的定义根本不需要类。

    多态性。

    大多数语言(尤其是静态类型的语言)根据类和继承定义多态性。如果有一个从a继承的类B,那么需要引用a的代码通常可以使用B,而不是与a无关的某个类C。Java还具有接口关键字,可以定义类必须实现的一组行为。

  • 吴开宇
    2023-03-14

    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和上文有一个重大的改进,让我们考虑一个不完全但更接近于面向对象的编程:调用超类的语法糖。

    例如:

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

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

    顺便说一句,ES2015及以上版本仍然缺乏真正的封装:像privatepublic这样的访问修饰符在哪里?无处

    最后,ES2015及以上版本实现了基于类的OOP,但它仍然是ECMAScript 5之上的语法糖层。十、上述代码仍然适用于机罩下的原型,其工作方式与在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另一种完全支持面向对象编程的语言!

     类似资料:
    • 问题内容: 我想知道两者之间的核心区别是什么 面向对象和基于对象的语言 我读过很多文章,所有人都说两件事 面向对象的语言支持OOP的所有功能,而基于对象的语言不支持OOP的所有功能,例如多态和继承。 他们给出了javascript作为基于对象和java作为面向对象的示例 像这个stackoverflow的帖子 面向对象和基于对象的语言之间的区别 但是我想知道这两种概念之间的核心区别是什么,而与任何

    • 问题内容: 面向对象的编程语言和基于对象的编程语言之间有什么区别?JavaScript是面向对象还是基于对象? 问题答案: 维基百科说: 在计算机科学中,基于对象一词具有两种不同的含义: 某种程度上受限的面向对象编程,其中应用了以下一项或多项限制:(a)没有隐式继承,(b)没有多态性,(c)仅可用值的非常少的子集是对象(通常是GUI组件)。 基于原型的系统(即基于“原型”对象的系统,这些对象不是任

    • 主要内容:SqlSessionFactoryBuilder,SqlSessionFactory,SqlSessionMyBatis 有三个基本要素: 核心接口和类 MyBatis核心配置文件(mybatis-config.xml) SQL映射文件(mapper.xml) 下面首先介绍 MyBatis 的核心接口和类,如下所示。   每个 MyBatis 应用程序都以一个 SqlSessionFactory 对象的实例为核心。 首先获取 SqlSessionFactoryBuilder 对象,可以

    • 关于一个语言被称为面向对象所需的功能,在编程社区内并未达成一致意见。Rust 被很多不同的编程范式影响,包括面向对象编程;比如第十三章提到了来自函数式编程的特性。面向对象编程语言所共享的一些特性往往是对象、封装和继承。让我们看一下这每一个概念的含义以及 Rust 是否支持他们。In my view the Gang of Four is the best book ever written on

    • 本文向大家介绍面向对象和面向过程的区别相关面试题,主要包含被问及面向对象和面向过程的区别时的应答技巧和注意事项,需要的朋友参考一下 面向过程:面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。 面向对象:面向对象易维护

    • 第 5 章 对象和面向对象 5.1. 概览 5.2. 使用 from module import 导入模块 5.3. 类的定义 5.3.1. 初始化并开始类编码 5.3.2. 了解何时去使用 self 和 __init__ 5.4. 类的实例化 5.4.1. 垃圾回收 5.5. 探索 UserDict: 一个封装类 5.6. 专用类方法 5.6.1. 获得和设置数据项 5.7. 高级专用类方法 5