Javascript构造函数是否与Java中的类或接口等效/类似

时间:2014-01-09 17:07:35

标签: java javascript

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

以下陈述是否准确(我只需要高级别的理解):

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

编辑:

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

  

Java程序主要是与其他人交谈的集合对象   对象通过调用彼此的方法。每个对象都是一个   某些类型,该类型由或   接口。大多数Java程序使用许多不同类型的集合。

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

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

由于

5 个答案:

答案 0 :(得分:6)

我会说你很亲密。 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中的 runtime 中实现“继承”。在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并没有提供任何这样的机制。

这些只是我头脑中的一些差异。重点是:它们是相似的,你建立联系是正确的。但他们绝对不一样。

答案 1 :(得分:4)

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");

答案 2 :(得分:0)

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

JavaScript继承基于对象,而不是类。直到你意识到这一点并不重要:     JavaScript是一种极其动态类型的语言 - 您可以使用适当的方法创建一个对象,这将使其符合接口,然后取消定义使其符合的所有内容。破坏类型系统很容易 - 甚至意外!首先尝试制作类型系统是不值得的。

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

如果您是Java新手,我建议您访问amazon.com并寻找一本关于java的初学书,该书有很好的评论并阅读它的封面。我认为这将最有效地利用你的时间,而不是阅读有关Java的varoius文章并将其拣选。我还建议你不要试图将你的Javascript知识移植到Java,至少你会更难学习Java。请注意,您可以阅读许多有关Java(Web)开发的书籍:Java,基于Java(JSF,Tomcat等)构建的产品以及支持技术(HTML,CSS,XML等)。