【问题标题】:Is Javascript constructor function equivalent/similar to a class or interface in JavaJavascript 构造函数是否等同于/类似于 Java 中的类或接口
【发布时间】:2014-01-28 09:16:38
【问题描述】:

我正在尝试学习 Java 的基础知识,并且我更熟悉 JavaScript。

以下说法是否准确(我只需要高层次的理解):

Javascript 构造函数或工厂函数是Java 中类或接口的等价物(我在这里松散地使用这个词)。

编辑:

这是我在 Java 书籍中读到的内容:

Java 程序主要是一个集合对象 对象通过调用彼此的方法。每个对象都是一个 某些 type,并且该类型由 class界面。大多数 Java 程序使用许多不同类型的集合。

来自 Javascript,上面听起来很像 JS 构造函数,类似于 Java 中定义对象属性和方法的类。

我知道 Java 和 JavaScript 是两种不同的语言。

谢谢

【问题讨论】:

  • Java 类有构造函数,如果那是你要问的。 Java 接口没有。
  • @crush OP 说的是 JS 中的构造函数,并不是说 Java 类和接口有构造函数。
  • 在我看来他在问一个 JS 构造函数是否等同于 Java 中的类或接口。
  • @crush 是的,这也是我的理解。但在这种情况下,您的评论毫无意义。
  • @crush 问题是,“构造函数”在 JS 和 Java 中的含义完全不同,即使两者可能具有可比性(我不确定)。您似乎混淆了共享相同术语的两个概念。

标签: java javascript


【解决方案1】:

我会说你很接近。 JavaScript 中的构造函数(和原型)是 与我们在 JS 中的 Java 类最接近的东西;但它们肯定不是“等价的”。

您可以在 JavaScript 构造函数的原型中动态添加或删除属性和方法;您不能在运行时从 Java 类中添加或删除内容。

例子:

function Foo() {}
Foo.prototype.hello = function() { alert('hello'); };

var f = new Foo();
f.hello(); // alerts 'hello'

delete Foo.prototype.hello;

f.hello(); // throws an error

您可以在 JavaScript 的运行时中实现“继承”,只需将构造函数的原型分配给任意对象即可。在 Java 中,您在编译时声明继承,并且不能在运行时更改。

例子:

function EnglishSpeaker() {}
EnglishSpeaker.prototype.greet = function() { return 'hello'; };

function SpanishSpeaker() {}
SpanishSpeaker.prototype.greet = function() { return 'hola'; };

function Me() {}
Me.prototype = EnglishSpeaker.prototype;

var me = new Me();
me instanceof EnglishSpeaker; // true
me.greet(); // 'hello'

Me.prototype = SpanishSpeaker.prototype;
me = new Me();
me instanceof EnglishSpeaker; // false
me instanceof SpanishSpeaker; // true
me.greet(); // 'hola'

在 JavaScript 中,原型只是一个对象。所以“类”(构造函数)可以从任何普通对象“继承”;因此“类型”和“值”之间的区别要宽松得多。

例子:

function Thing() {}

var randomObject = { foo: 1, bar: 2 };
Thing.prototype = randomObject;

var thing = new Thing();
thing.foo; // 1

在 Java 中,您可以定义某个类必须实现的接口。 JavaScript 并没有真正提供任何这样的机制。

这些只是我脑海中的一些差异。要点是:它们很相似,您可以建立联系。但它们绝对不一样。

【讨论】:

    【解决方案2】:

    JavaScript:

    function Cat(name) {
        this.name = name;
        this.talk = function() {
            alert( this.name + " says meeow!" );
        };
    } 
    
    var cat1 = new Cat("Felix");
    

    在 Java 中:

    public class Cat {
        private String name;
    
        public Cat(String name) {
            this.name = name;
            this.talk();
        }
    
        public void talk() {
            System.out.println( this.name + " says meeow!" );
        }
    } 
    
    Cat cat1 = new Cat("Felix");
    

    【讨论】:

    • 这里的 Java 无效。 This paste 表明它已更正并遵循 Java 命名约定。
    • 谢谢,更新了我的帖子。完全忘记了公共和无效:D
    • 你可以在java构造函数中模拟JS的arguments参数Varargspublic Cat(String name,Object...arguments)
    【解决方案3】:

    来源:Does JavaScript have the interface type (such as Java's 'interface')?

    JavaScript 继承基于对象,而不是类。在您意识到之前,这没什么大不了的: JavaScript 是一种极其动态类型的语言——您可以使用适当的方法创建一个对象,使其符合接口,然后取消定义使其符合的所有内容。颠覆类型系统非常容易——即使是偶然的!首先尝试创建类型系统是不值得的。

    【讨论】:

      【解决方案4】:

      如果您来自 JavaScript 并学习 Java,那么我认为其他人还没有提到一个巨大的差异。

      在 JavaScript 中,函数是一个对象。一个对象可以包含属性,其值可以是函数对象,也可以是其他对象或原始值。当你调用obj.method(arguments)时,语义是寻找对象(或原型)的method属性,如果是函数对象,则调用它。

      在 Java 和其他具有 OOP 特性的编译语言中,函数不是对象。如果创建特定类型的新对象,则对象中的“类型”信息指的是该类型的多态函数列表。这就是多态性在这些语言中的工作方式。如果调用obj.method(arguments),而method是一个可以为派生类型重写的方法,那么程序会查找obj的类型,然后在函数列表中查找类型以确定调用哪个函数.对我来说,这意味着对象的类型是这些语言中的关键信息,而 OOP 围绕它展开;而在 JavaScript 中,对象的“类型”就不太重要了,因为函数本身是在对象中通过名称查找的。可以通过某种方式使用 JavaScript,使其看起来像是在模拟其他语言处理 OOP 的方式,但这不是必需的,也不是该语言的内置部分。

      我认为你在从一个到另一个时必须牢记这一点。如果您过于努力地将 Java 功能与您已经熟悉的 JavaScript 功能联系起来,那将会令人困惑。

      【讨论】:

        【解决方案5】:

        如果您是 Java 新手,我建议您访问 amazon.com 并寻找一本评价良好的 Java 入门书籍,并从头到尾阅读。我认为这将是最好的利用你的时间,而不是阅读关于 Java 的各种文章并把它捡起来。我还建议您不要尝试将您的 Javascript 知识移植到 Java,至少您会使学习 Java 变得更加困难。请注意,您可以阅读许多有关 Java(Web)开发的书籍:Java、基于 Java 构建的产品(JSF、Tomcat 等)以及支持技术(HTML、CSS、XML 等)。

        【讨论】:

          猜你喜欢
          • 2014-03-23
          • 2023-03-08
          • 2012-10-27
          • 1970-01-01
          • 2011-01-28
          • 1970-01-01
          • 2019-11-26
          • 2015-05-21
          • 2011-11-14
          相关资源
          最近更新 更多