这两种在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代码的幕后创建一个类。