JavaScript中的Java面向对象概念

9
我已经使用Java很长一段时间了,并且在相当长的一段时间里,我一直在使用GWT(Google Web Toolkit)进行Web开发。它的美妙之处在于我有我的Java面向对象构造,并不需要担心它是如何被转换成GWT的 - 让谷歌来处理。我的Javascript知识足够,但是不足以进行重度Web开发。 后来,我决定必须更深入和全面地了解Javascript,这是一段真正的过山车之旅 - 就在我认为我已经掌握了某些东西的时候,一些东西出现并证明我是错的 - 我只是误解了。 比起其他任何地方,我更想在stackoverflow上表达我的担忧:我请求提供一些资源和指针,以便找到一些与以下Java概念类似的Javascript等效概念:
Class
instance of a class - object
Member variables
Getters
Setters
Abstract Class
Interface
Inheritance
Access Modifiers
Constructors

我知道其中一些概念,但是正如我所说,我相信我在理解上有一些困难。如果有人能够指出一个真正的JavaScript大师试图在这里概括这些概念,我会非常高兴。


1
这是一个好问题,但我投票关闭它,因为它的范围非常广泛。 - Perception
3
问题在于,其中一半的概念在JS中不存在,部分原因是基于原型的OOP和动态类型。试图翻译这些单个概念不会有太大进展。 - user395760
2
我投票反对关闭,因为他不希望我们解释这些东西。他只想要好资源的链接。 - J. K.
我正在学习的课程的前两章详细解释了一些概念,特别是作用域、继承和构造函数。http://eventedmind.com/courses/1-advanced-javascript-concepts。 - cmather
8个回答

6
我认为您主要需要理解 Javascript 是一门纯粹的面向对象编程语言,但它没有类!对于 Java 程序员来说这可能是一个震惊,需要花些时间去适应,但这是一个非常强大的编程范式。
这里有一个视频来自 Douglas Crockford,他是帮助创建 Javascript 的人之一,对于新手 Javascript 程序员非常有用。 http://www.youtube.com/watch?v=v2ifWcnQs6M

JavaScript不是纯面向对象编程语言,但它提供了基于对象和基于原型的特性。 - ingyhere

5

3
JavaScript是一门纯面向对象的语言,但它缺少像Java或C#这样基于类的面向对象编程语言中的某些概念。不过好消息是,ECMA的工作人员正在努力解决这个问题,将抽象、类、命名空间、继承、属性等面向对象概念引入JavaScriptPeter Michaux对此有很好的解释

3
在JavaScript中,基本的经验法则是它几乎可以让你做任何事情。没有访问修饰符。由于JavaScript并不阻止很多东西,因此像抽象类这样的东西就没有意义。你总是可以实例化它。
类似于类的行为来自于对象,您可以使用原型获得类似于构造函数的行为。http://www.javascriptkit.com/javatutors/proto.shtml 成员变量类似,但是未经类型定义,并且还可以包含函数以及数据。
在JavaScript中,您需要个人纪律和强大的代码约定来模拟任何这些东西,但语言不会帮助您一点。它非常灵活,这意味着它不会妨碍您,但也给您提供了足够的绳索来绞死自己。
最好将其视为完全不同的语言。不要试图将其与Java相关联,因为在许多方面它根本不同。
名称是其中最相关的部分,这创造了很多困惑...

3

我也曾经像你一样寻找知识,但不得不在各处搜集和获取。

stackoverflow上有大量关于这些主题的优秀帖子,还有MDN(Mozilla开发者网络)。我还建议查看流行库(如jquery)的源代码。请参见此源代码查看器:http://james.padolsey.com/jquery/

这是由伟大的John Resig制作的一个杰出的交互式教程:
http://ejohn.org/apps/learn/

以下是一些非常好的SO帖子,帮助我更好地理解JS:

如何“正确”创建JavaScript中的自定义对象?
JavaScript中的“new”关键字是什么?
为什么要使用JavaScript原型? 为什么需要设置原型构造函数?
使用Douglas Crockford的函数继承在Javascript中调用基本方法
帮助理解jQuery的jQuery.fn.init,为什么init在fn中
jQuery.fn是什么意思?
为什么JavaScript中的“this”分辨率如此特殊?
call和apply之间有什么区别?
动态函数调用(apply)
JavaScript数据格式化/漂亮的打印机
检查JavaScript对象中是否存在键?

以下是关于JavaScript怪异性以及你可能不知道的一些内容:

是否可以反射 Javascript 函数的参数?
JavaScript 函数参数
JavaScript 中 !!(非非)运算符是什么意思?
(function( window, undefined ) { })(window) 这个 JavaScript/JQuery 语法是如何工作的?
在 JavaScript 比较中应该使用哪个等于运算符(== 还是 ===)? JavaScript 中 delete 运算符的行为
var myArray =[], name; 是什么意思?
null 是什么,null 和 undefined 有什么区别?
JavaScript 中如何检查 null/undefined?
���叹号在函数前面有什么作用?


1

我曾经也遇到过你在尝试学习Javascript时所经历的相似的困惑。Douglas Crockford 的《Javascript语言精髓》以及他的网站 http://crockford.com/ 对我帮助极大。


1

我可以想到一些参考资料,可以回答这些问题,其中明确指出JavaScript是一种弱类型、动态语言,而Java是一种强类型、静态语言。我觉得这是你所寻求的直接类比。

对于列出的前五个项目中的许多常见问题,阅读Working with Objects部分的JavaScript GuideMozilla Developer Network上会有所启发。(类,类的实例-对象,成员变量,获取器,设置器)

我认为第二组项目在Douglas Crockford的this site中得到了很好的解释。他是O'Reilly书籍“Javascript: The Good parts”和JSLint代码工具的作者。(抽象类、接口、继承、访问修饰符、构造函数) Crockford在一篇页面中直接比较Java和JavaScript,描述了JavaScript不仅支持经典继承,还支持其他代码重用模式


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接