栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Javascript是一种面向原型的语言。

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

  • 构造函数。
  • 方法(即Javascript中的函数)。
  • 属性(自ECMA脚本5开始,“ getters / setters”)。
  • 实例。

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

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及更高版本是否改变了情况?

从美学上讲是的,ES2015及更高版本具有重大改进,可以考虑不完全但更接近于面向对象的编程:调用 超类的 语法糖。

例如:

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

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

BTW,ES2015及以上仍然缺乏真正的封装: 哪里都像访问修饰符

private
public
在这里?
无处

而且,归根结底,ES2015及更高版本实现了基于类的OOP,但它仍然是ECMAscript
5.x之上的语法糖层。…上面的代码仍然可以在底层使用原型,并且以相同的方式工作就像您将在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另一种完全支持面向对象编程的语言!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/497394.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号