这两种在javascript中创建类的方法之间的区别

时间:2010-01-31 18:52:42

标签: javascript

这两种创建类的方法有什么区别:

var apple = {
    type: "macintosh",
    color: "red",
    getInfo: function () {
        return this.color + ' ' + this.type + ' apple';
    }
}

function Apple (type) {
    this.type = type;
    this.color = "red";
    this.getInfo = function() {
        return this.color + ' ' + this.type + ' apple';
    };
}

以及如何实例化和使用成员?

3 个答案:

答案 0 :(得分:6)

虽然JavaScript是面向对象的语言,但它不使用类。您不在JavaScript中创建“类”。你创建了一个“原型”。 JavaScript被视为Prototype-based language

第一个示例称为“object-literal notation”,用于创建对象(其子集通常称为JSON)。在基于类的语言中类比这是一个“静态”类,在这种情况下你不需要创建一个新的对象实例;一旦你定义它,它就“存在”。你不会实例化它,你可以立即访问apple的成员,因为apple已经是一个对象。它也类似于在Java中创建匿名类。你会这样使用它:

alert(apple.getInfo());

使用第二个示例,您将创建一个原型(不是类),可用于实例化Apple类型的对象。您可以像这样使用它:

var redDelicious = new Apple("Red Delicious");
alert(redDelicious.getInfo());

JavaScript允许您修改和添加到对象的原型,因此在您声明了Apple原型之后,您仍然可以继续添加或更改它的内容:

Apple.prototype.size = "7cm";

执行此操作时,从Apple原型派生的所有对象都将获得size字段。这是PrototypeJS framework如何修改原生JavaScript对象以及添加的基础。修复功能。

请记住,修改原生JavaScript对象的原型被认为是不好的做法,因此您应该尽可能避免这样做。

答案 1 :(得分:3)

您的第一种方法是JavaScript Object Literal,可以通过以下方式访问:

apple.type;  // returns "macintosh"
apple.getInfo(); // prints "red macintosh apple"

您还可以添加自己的属性,例如wasGoodprice,如下所示:

apple.wasGood = "true";
apple.price = "0.50";  
alert(apple.price); // alerts "0.50"

您的第二种方法是实例化一个对象,可以通过以下方式访问:

var myApple = new Apple("macintosh");
myApple.type; // returns "macintosh"
myApple.getInfo(); // returns "red macintosh apple"

要向Apple对象添加属性,您需要使用prototype关键字:

Apple.prototype.price = "0.50";
Apple.prototype.wasGood = "true";
alert(myApple.price); // alerts "0.50"

答案 2 :(得分:3)

以下是一些差异:

  • 第一种方式不完整,在最后一个结束括号后缺少分号。

  • 第一种方法创建一个对象,而第二种方式只声明一个可用于创建对象的构造函数。

  • 第一种方式只能创建一个对象,而new关键字可以使用第二种方式创建多个对象。

  • 第一种方法不能使用任何参数来影响对象的初始化方式,而第二种方法可以。

第一种方法创建一个对象并分配给apple变量,您可以使用该变量来访问成员:

alert(apple.type);

第二种方式与new关键字一起用于创建实例:

var green = new Apple('Signe Tillisch');
alert(green.type);