Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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
这两种在javascript中创建类的方法之间的区别_Javascript - Fatal编程技术网

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

这两种在javascript中创建类的方法之间的区别,javascript,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

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

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';
    };
}

如何实例化和使用成员?

虽然JavaScript是一种面向对象的语言,但它不使用类。您不需要在JavaScript中创建“类”。你创建了一个“原型”。JavaScript被认为是一种新的语言

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

alert(apple.getInfo());
var redDelicious = new Apple("Red Delicious");
alert(redDelicious.getInfo());
Apple.prototype.size = "7cm";
在第二个示例中,您正在创建一个原型(而不是一个类),该原型可用于实例化类型为
Apple
的对象。您可以这样使用它:

alert(apple.getInfo());
var redDelicious = new Apple("Red Delicious");
alert(redDelicious.getInfo());
Apple.prototype.size = "7cm";
JavaScript允许您修改和添加对象的原型,因此在声明了您的
Apple
prototype之后,您仍然可以继续添加或更改有关它的内容,如下所示:

alert(apple.getInfo());
var redDelicious = new Apple("Red Delicious");
alert(redDelicious.getInfo());
Apple.prototype.size = "7cm";
执行此操作时,从
Apple
prototype派生的所有对象将获得一个
size
字段。这是如何修改本机JavaScript对象以添加和修复功能的基础

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

您的第一种方法是:

apple.type;  // returns "macintosh"
apple.getInfo(); // prints "red macintosh apple"
var myApple = new Apple("macintosh");
myApple.type; // returns "macintosh"
myApple.getInfo(); // returns "red macintosh apple"
您还可以添加自己的属性,如
wasGood
price
等:

apple.wasGood = "true";
apple.price = "0.50";  
alert(apple.price); // alerts "0.50"
第二种方法是实例化对象,可通过以下方式访问:

apple.type;  // returns "macintosh"
apple.getInfo(); // prints "red macintosh apple"
var myApple = new Apple("macintosh");
myApple.type; // returns "macintosh"
myApple.getInfo(); // returns "red macintosh apple"
向Apple对象添加属性您需要使用关键字:


以下是一些区别:

  • 第一种方式不完整,最后一个右括号后缺少分号

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

  • 第一种方法只能创建一个对象,而第二种方法可由
    new
    关键字用于创建多个对象

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

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

alert(apple.type);
第二种方法与
new
关键字一起用于创建实例:

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

您只创建了一个对象,而不是一个类。第一个示例不是一个静态类。它是一个使用对象文字语法创建的JS对象。@SolutionYogi我知道它不是一个静态类;我在回答中提到的第一件事是JavaScript中没有类。然而,使用人们已经熟悉的类比来解释JavaScript基于原型的语法更容易,如果他们使用的是使用类的语言进行编程的话。我仍然觉得将其称为“静态类”是完全错误的。静态类不能有状态。我可以这样说:在传统的OOP语言中,没有类就不能创建对象,但在JavaScript中,可以。这就是用户在第一个例子中所做的。对象文字和“静态”类之间有什么相似之处?当您将第一个称为“静态”类,而将第二个称为“原型(非类)”时,我发现这很奇怪。如果我将JavaScript与其他OOP语言进行类比,我肯定会说第二种情况类似于创建“普通”类(与其他OOP语言一样),而第一种情况只是一个对象。@SolutionYogi&@bryantsa我更新了我的答案,以便更清楚地解释我在答案中试图解释的内容。我同意我所说的并不完全准确。尽管如此,静态类可以有状态,这是每个OO编程语言在创建单例对象时所依赖的。Java和C#(以及其他,我确信)可以在不创建类的情况下拥有一个对象,尽管我认为编译器在创建匿名类时确实会在IL代码的幕后创建一个类。