- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想知道两者的核心区别是什么
面向对象和基于对象的语言
我看过很多帖子,他们都在说两件事
面向对象的语言支持 OOP 的所有特性,而基于对象的语言不支持 OOP 的所有特性,如多态性和继承。
他们给出了 javascript 作为基于对象和 java 作为面向对象的例子
赞这个stackoverflow的帖子
Difference between object oriented and object based language
但我想知道这两个概念之间的核心区别是什么,无论任何语言。
找到答案
终于搞定了
感谢Matías Fidemraizer
答案不依赖于任何语言,不依赖于任何功能,我正在寻找的核心差异是
本身包含对象的语言称为基于对象的语言,遵循面向对象概念的语言称为面向对象语言
最佳答案
JavaScript 是一种面向原型(prototype)的语言。
它可以从构造函数构建实际对象,并且几乎具有任何对象可能具有的任何功能:
在 JavaScript 中,任何对象都有一个原型(prototype),包括函数。原型(prototype)本身是将对象成员添加到整个对象的任何新创建实例的基本方法。
var constructor = function() { };
constructor.prototype.text = "hello world";
alert(new constructor().text); // This alerts hello world
为什么 JavaScript 不是面向对象的编程(脚本)语言?因为它没有符合面向对象编程定义要求的特性:
也许我忘了提一些其他的细节,但老实说,我相信这是一个很好的总结。
核心区别在于面向对象的编程语言具有面向对象范式必须具备的特性才能被视为面向对象的编程语言。 因此,JavaScript 目前还不是一种真正的面向对象的编程语言,因为它缺乏真正的多态性和继承性。
从美学上讲是的,ES2015 及更高版本有一个重大改进,让我们考虑不完全但更接近面向对象的编程:调用父类(super class)的语法糖。
例如:
class A {
doStuff() {
console.log("hello world");
}
}
class B extends A {
doStuff() {
super.doStuff();
console.log("...and goodbye!");
}
}
这是多态。更专业的类可以覆盖其基类以完全改变函数行为或执行基类已经在做的事情,向函数添加新代码。
顺便说一句,ES2015 及更高版本仍然缺乏真正的封装:private
或 public
之类的访问修饰符在哪里? 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/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!