Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java到javascript:对象模型_Java_Javascript_Coffeescript - Fatal编程技术网

从java到javascript:对象模型

从java到javascript:对象模型,java,javascript,coffeescript,Java,Javascript,Coffeescript,我正在尝试将我用java编写的应用程序移植到javascript(实际上使用的是coffeescript) 现在,我感到迷路了。。您建议如何创建类属性?我应该使用getter/setter吗?我不喜欢这样做: myObj.prop = "hello" 因为我可以使用不存在的属性,而且很容易错卖东西 如何让javascript更像java,具有私有、公共的最终属性等等。。?有什么建议吗?目前您有很多选择,您可以查看dojo库。在dojo中,您可以像java编程一样编写代码 类 Javascrip

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

现在,我感到迷路了。。您建议如何创建类属性?我应该使用getter/setter吗?我不喜欢这样做:

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的解决方案和其他解决方案
    解决您的一些具体问题:

    您建议如何创建类属性?我应该使用getter/setter吗?我不喜欢这样做:

    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