从java到javascript:对象模型
我正在尝试将我用java编写的应用程序移植到javascript(实际上使用的是coffeescript) 现在,我感到迷路了。。您建议如何创建类属性?我应该使用getter/setter吗?我不喜欢这样做:从java到javascript:对象模型,java,javascript,coffeescript,Java,Javascript,Coffeescript,我正在尝试将我用java编写的应用程序移植到javascript(实际上使用的是coffeescript) 现在,我感到迷路了。。您建议如何创建类属性?我应该使用getter/setter吗?我不喜欢这样做: myObj.prop = "hello" 因为我可以使用不存在的属性,而且很容易错卖东西 如何让javascript更像java,具有私有、公共的最终属性等等。。?有什么建议吗?目前您有很多选择,您可以查看dojo库。在dojo中,您可以像java编程一样编写代码 类 Javascrip
myObj.prop = "hello"
因为我可以使用不存在的属性,而且很容易错卖东西
如何让javascript更像java,具有私有、公共的最终属性等等。。?有什么建议吗?目前您有很多选择,您可以查看dojo库。在dojo中,您可以像java编程一样编写代码
Javascript没有像Java这样的类系统,dojo提供dojo.declare来定义一个功能来模拟它。看看这个。有字段变量、构造函数方法、从其他类扩展
这并不能直接回答你的问题,但我会放弃让JavaScript应用程序像Java一样的想法。它们确实是不同的语言(尽管在语法和名称上有一些相似之处)。一般来说,在移植东西时采用目标语言的习惯用法是有意义的。Dojo是一种选择。我个人更喜欢。它还有一个框架和API,用于创建类和以更“java化”的方式使用继承。请参阅API中的方法。我已经在我工作过的多个Web应用程序上使用过它。你可以使用它来创建私有属性和公共访问器,作为一个额外的选项。我主要同意@Willie Wheeler的观点,你不应该太努力地让你的应用程序像Java一样-有一些方法可以使用JavaScript来创建私有成员等东西-其他人已经写过这类事情。如果你只是将Java代码翻译成JavaScript,你将不断地与JavaScript的对象模型作斗争,后者是基于原型的,而不是基于类的。对象上没有私有属性,没有最终属性,除非您使用的是引擎(您没有提到您的目标运行时环境是什么;浏览器与ES5不兼容,还需要几年),事实上根本没有类 相反,我建议您彻底地介绍一下面向对象在JavaScript中的实际工作方式,然后构建完全包含JavaScript如何工作的应用程序。这不是小事,但值得一试 一些可能有用的物品。我从闭包开始,因为真正理解闭包对于编写JavaScript是绝对必要的,而大多数“私有成员”解决方案都依赖闭包。然后我引用了道格拉斯·克罗克福德的几篇文章。如果你打算使用JavaScript,即使你最终不同意他的一些结论,Crockford也是必读的。然后,我指出了几篇专门讨论类操作的文章
- 包括语法糖,以便更容易地设置对象的层次结构(它使用基于类的术语,但实际上它只是原型继承),包括调用“超类”方法
- 列出Crockford的解决方案和其他解决方案
myObj.prop = "hello"
myObj.prop=“你好”
因为我可以使用不存在的属性,而且很容易错卖东西
我不喜欢,我更喜欢使用,以确保如果我有一个打字错误,它会在测试中显示出来。(一个好的代码完成编辑器在这里也会很有帮助,尽管真正好的JavaScript代码完成编辑器还很薄弱。)但您是对的,Java意义上的getter和setter(方法如getFoo
和setFoo
)当您创建/访问未预先定义的属性(例如,通过键入)时,会导致运行时错误,调用不存在的函数,这会使情况变得更加明显。(我之所以说“在Java意义上”,是因为ES5的JavaScript具有透明的特性,而这并没有帮助。)这就是使用它们的理由。如果你这样做了,你可能会考虑使用谷歌的发布版本,因为它将内联这些版本
我怎样才能让javascript更像java,有私有的
我链接了Crockford关于私人会员的文章,以及我自己的文章,其中列出了其他方式。Crockford模型最基本的解释是:在调用构造函数函数创建的上下文中使用变量,在该上下文中创建的函数(闭包)可以访问变量,而不是对象属性:
function Foo() {
var bar;
function Foo_setBar(b) {
bar = b;
}
function Foo_getBar() {
return bar;
}
this.setBar = Foo_setBar;
this.getBar = Foo_getBar;
}
bar
不是对象属性,但是上下文中定义的函数对它有持久的引用。如果你想要有少量的Foo
对象,这是完全可以的。如果你将有数千个Foo
对象,你可能需要重新考虑,因为每个Foo
对象都有自己的两个函数(真正不同的Function
实例),分别用于Foo\u getBar
和Foo\u setBar
你会经常看到上面这样写的:
function Foo() {
var bar;
this.setBar = function(b) {
bar = b;
};
this.getBar = function() {
return bar;
};
}
是的,它更简洁,但是现在函数没有名称,并且给出了函数的名称
如何使javascript更像java,并具有公共最终属性
您可以定义一个Java风格的getter,而不需要setter。或者,如果您的目标环境符合ES5标准(同样,浏览器还不符合,还需要几年),您可以使用新功能设置无法写入的属性
但我的主要观点是接受你工作的语言和环境。好好学习它,你会发现不同的模式适用于Java。这两种语言都很好(我经常使用它们),但它们的工作方式不同,导致了不同的解决方案。我是au