从java到javascript:对象模型

luc*_*uca 8 javascript java coffeescript

我正在尝试将我在java中编写的应用程序移植到javascript(实际上使用coffeescript).

现在,我感到迷茫......你有什么建议来创建类属性?我应该使用getter/setter吗?我不喜欢这样做:

myObj.prop = "hello"
Run Code Online (Sandbox Code Playgroud)

因为我可以使用非现有的属性,很容易误解一些东西..

我怎样才能使javascript更像java,具有私有,公共最终属性等...?有什么建议吗?

T.J*_*der 8

如果您只是将Java代码翻译成JavaScript,那么您将不断地与JavaScript的对象模型进行对抗,这种模型基于原型,而不是基于类.对象上没有私有属性,没有最终属性,除非您使用的是ES5兼容引擎(您没有提到目标运行时环境是什么;浏览器不使用ES5兼容,它将是另一个事实上,根本没有课程.

相反,我建议您彻底了解面向对象如何在JavaScript中实际工作,然后构建完全包含JavaScript的应用程序.这不是微不足道的,而是有益的.

一些可能有用的文章.我从闭包开始,因为真正理解闭包对于编写JavaScript是绝对必要的,并且大多数"私有成员"解决方案依赖于闭包.然后我参考Douglas Crockford的几篇文章.如果你打算使用JavaScript工作,Crockford是必读的,即使你最终不同意他的一些结论.然后我指出几篇专门针对做类似事情的文章.

解决您的一些具体问题:

你有什么建议来创建类属性?我应该使用getter/setter吗?我不喜欢这样做:

myObj.prop = "hello"

因为我可以使用非现有的属性,很容易误解一些东西..

我没有,我更喜欢使用TDD来确保如果我确实有拼写错误,它会在测试中显示出来.(良好的代码完成编辑器也会有帮助在这里,虽然真的很不错的JavaScript代码,完成编辑是在地面上薄.)但你说得对,getter和setter Java中的(类似的方法getFoosetFoo)使其更当您创建/访问未事先定义的属性(例如,通过拼写错误)时,通过导致运行时错误,调用不存在的函数,这是显而易见的.(我说"在Java意义上",因为ES5中 JavaScript有一种不同的"getters"和"setter",它们是透明的,对此没有帮助.)所以这是使用它们的论据.如果你这样做,你可能会考虑使用Google的Closure编译器来发布版本,因为它会内联它们.

如何让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;
}
Run Code Online (Sandbox Code Playgroud)

bar不是对象属性,但在上下文中定义的函数具有持久的引用.如果您将拥有少量的Foo物体,这完全没问题.如果你将有数以千计的Foo对象,你可能要重新考虑,因为每个 Foo对象都有自己的两个功能(真真正不同Function背景)Foo_getBarFoo_setBar.

你会经常看到上面这样写的:

function Foo() {
    var bar;

    this.setBar = function(b) {
        bar = b;
    };
    this.getBar = function() {
        return bar;
    };
}
Run Code Online (Sandbox Code Playgroud)

是的,它更简洁,但现在功能没有名称,并提供您的功能名称可以帮助您的工具帮助您.

如何让javascript更像java,具有... public final属性

您可以定义没有setter的Java样式的getter.或者,如果您的目标环境符合ES5标准(同样,浏览器还没有,那将是另外几年),您可以使用Object.defineProperty允许您设置无法写入的属性的新功能.

但我的主要观点是拥抱你工作的语言和环境.学得很好,你会发现不同的模式适用于Java.两者都是优秀的语言(我经常使用它们),但它们的工作方式不同并导致不同的解决方案.