我想知道两者的核心区别是什么
面向对象和基于对象的语言
我看过很多帖子他们都在说两件事
>
面向对象语言支持OOPs的所有特性,而基于对象的语言不支持OOPs的所有特性,如多态性和继承。
他们给出了基于对象的javascript和面向对象的java的例子
比如这篇stackoverflow的帖子
面向对象语言与基于对象语言的区别
但我想知道,无论使用何种语言,这两个概念之间的核心区别是什么。
找到答案了吗
终于有东西了
感谢Matías Fidemraizer
答案不依赖于任何语言,也不依赖于任何特征,我正在寻找的核心区别就是
包含对象的语言称为基于对象的语言,遵循面向对象概念的语言称为面向对象语言
JavaScript是一种面向原型的语言。
它可以从构造函数中构建实际对象,并且它几乎具有任何对象都可能具有的任何功能:
在JavaScript中,任何对象都有一个原型,包括函数。原型本身是向整个对象的任何新创建实例添加对象成员的基本方式。
var constructor = function() { };
constructor.prototype.text = "hello world";
alert(new constructor().text); // This alerts hello world
为什么JavaScript不是面向对象编程(脚本)语言?因为它没有符合面向对象编程定义要求的功能:
也许我忘了提到其他一些细节,但我真诚地相信这是一个很好的总结。
核心区别在于,面向对象编程语言具有面向对象范例必须具备的特性,才能被视为面向对象编程语言。因此,JavaScript目前并不是一种真正的面向对象编程语言,因为它缺乏实际的多态性和继承性。
美观地说,是的,ES2015和上文有一个重大的改进,让我们考虑一个不完全但更接近于面向对象的编程:调用超类的语法糖。
例如:
class A {
doStuff() {
console.log("hello world");
}
}
class B extends A {
doStuff() {
super.doStuff();
console.log("...and goodbye!");
}
}
这是多态性。更专业化的类可以重写其基类,以完全更改函数行为,或执行基类已经在做的事情,向函数添加新代码。
顺便说一句,ES2015及以上版本仍然缺乏真正的封装:像private
或public
这样的访问修饰符在哪里?无处
最后,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另一种完全支持面向对象编程的语言!
基于对象的语言基本上包括任何提供轻松创建和使用对象的内置能力的语言。有一个主要标准:
>
大多数基于对象的语言用“类”来定义对象,类基本上是对象的蓝图。该类布局了对象的内部结构,并定义了应用编程接口。
不过,这不是唯一的办法。例如,在JavaScript中,对象实际上没有“类”。任何对象都可以有它想要的任何属性。由于函数在JavaScript中是一级值,因此可以将它们设置为对象的属性,并用作对象的API。
就基于对象而非面向对象的语言而言,一个很好的例子是VisualBasic(不是.net的东西;我说的是VB6和VBA)。类存在,但不能相互继承。
面向对象语言是一种基于对象的语言,它使事情更进一步。它们对OOP的另外两个支柱提供了内置支持:
>
继承权。对象必须具有成为(并被视为)其他对象的专门化的能力。这意味着,例如,能够将“狗”定义为“能吠叫和拿棍子的动物”。
在现代语言中,它通常采取一个对象的类继承另一个对象的类的形式。然而,这不是一个要求;与一些人试图告诉你的相反,面向对象编程的定义根本不需要类。
多态性。
大多数语言(尤其是静态类型的语言)根据类和继承定义多态性。如果有一个从a继承的类B,那么需要引用a的代码通常可以使用B,而不是与a无关的某个类C。Java还具有接口
关键字,可以定义类必须实现的一组行为。
仅仅使用对象并不意味着你在做面向对象编程,即使是在完全面向对象的语言中,如果你没有实现面向对象技术,它只是基于对象的编程。