gpt4 book ai didi

java - 面向对象和基于对象的语言之间的核心区别

转载 作者:IT老高 更新时间:2023-10-28 21:01:15 30 4
gpt4 key购买 nike

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

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

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

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

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

赞这个stackoverflow的帖子

Difference between object oriented and object based language

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

找到答案

终于搞定了

感谢Matías Fidemraizer

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

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

最佳答案

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

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

  • 构造函数。
  • 方法(即 JavaScript 中的函数)。
  • 属性(从 ECMA-Script 5 开始,“getters/setters”)。
  • 实例。

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

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

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

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

  • 多态性:。您可以更改原型(prototype)成员的行为,但这只是重用标识符。您无法访问 伪派生对象中成员的先前实现。
  • 继承:完全没有。也许原型(prototype)链可以与继承相媲美,但 JavaScript(ECMA-Script 5.x 或更早版本)没有像其他基于 OOP 的语言(即 Java、C#、Ruby、Python、VisualBasic.NET 等)那样基于语法的继承。 )。
  • 封装。是的,当然可以,但无法创建实际的私有(private)或内部对象成员。

也许我忘了提一些其他的细节,但老实说,我相信这是一个很好的总结。

更新与总结

核心区别在于面向对象的编程语言具有面向对象范式必须具备的特性才能被视为面向对象的编程语言。 因此,JavaScript 目前还不是一种真正的面向对象的编程语言,因为它缺乏真正的多态性和继承性

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

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

例如:

class A {
doStuff() {
console.log("hello world");
}
}

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

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

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

而且,归根结底,ES2015 及更高版本实现了基于类的 OOP,但它仍然是 ECMAScript 5.x 之上的语法糖层......上面的代码仍然适用于引擎盖下的原型(prototype)并且它有效就像在 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 视为另一种完全支持面向对象编程的语言!

关于java - 面向对象和基于对象的语言之间的核心区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15430004/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com