这是一个简单的例子,用于在JavaScript中定义“类”,创建它的实例,并调用其中一个方法/函数
// Define a class like this
function Person(name, gender){
// Add object properties like this
this.name = name;
this.gender = gender;
}
// Add methods like this. All Person objects will be able to invoke this
Person.prototype.speak = function(){
alert("Howdy, my name is" + this.name);
};
// Instantiate new objects with 'new'
var person = new Person("Bob", "M");
// Invoke methods like this
person.speak();
在开头句子中使用引号的原因是因为上面根本不是一个类,因为JavaScript没有类。那么描述上述内容的最佳词是什么?
我知道Person
是构造函数,speak
是一个方法,但是构造函数及其方法的整体规范术语是什么。显然在Java,C ++,C#等中它会被称为类,但我不确定JavaScript中的等效术语是什么?
答案 0 :(得分:2)
构造函数是引用它的典型方法
然而,你可以把它称为一个类,我非常怀疑任何人会在实际或工作环境中与你争论。它本质上仍然是一个概念类,即使Javascript没有这样实现它 - 任何人都会看到代码会理解你是基于类的定义来创建一个对象。
实现明显不同,但意图(足够近)相同,并且使用相同的名称是相当公平的。如果不出意外,它不太可能引起混淆
我不会答应是否有人会在研究或学术环境中与你争论....
答案 1 :(得分:2)
JavaScript没有类,但我仍称它为类。 ECMAScript Harmony将向JavaScript引入classes(虽然它们不是真正的类)。这就是您的代码在ECMAScript Harmony中的外观:
class Person {
constructor(name, gender) {
this.name = name;
this.gender = gender;
}
speak() {
alert("Howdy, my name is " + this.name + ".");
}
}
var person = new Person("Bob", "M");
person.speak();
这可以在当前的JavaScript中模拟如下:
var Person = defclass({
constructor: function (name, gender) {
this.name = name;
this.gender = gender;
},
speak: function () {
alert("Howdy, my name is " + this.name + ".");
}
});
var person = new Person("Bob", "M");
person.speak();
function defclass(prototype) {
var constructor = prototype.constructor;
constructor.prototype = prototype;
return constructor;
}

正如您所看到的,defclass
函数接受原型对象并返回“类”。每个类都必须有一个构造函数。
有两种类型的面向对象编程语言:经典语言和原型语言。
类和原型是同构的(即原型可以转换为类,类可以转换为原型)。有关详细信息,请参阅以下问题的答案:
How to achieve pseudo-classical inheritance right on the class declaration?
上图取自以下问题的答案:
JavaScript inheritance and the constructor property
在你的问题中,你要求的术语描述了构造函数及其方法的总体。
构造函数及其方法都是prototype对象的属性。因此,整体的规范术语是“原型”。
然而,由于原型和类是同构的,你也可以把它称为“类”。
以下问题的答案解释了原型如何与类同构:
classical inheritance vs protoypal inheritance in javascript
总结一下,你要求的术语是“原型”。原型与类同构。因此你也可以把它称为“阶级”。 Prototypes有一个构造函数方法,通常用于创建原型的实例。构造函数不是整体,而是整体的一部分。
到目前为止,我只是说原型与类同构而没有说明如何,因为我不想复制我以前的答案。但是,有些重复是好的。
正如我之前所说,有两种类型的面向对象语言:经典语言和原型语言。在经典语言中,你有两个独立的东西用于抽象(对象)和泛化(类)。
简要解释抽象和概括:
name
和gender
等属性的对象来表示。这个对象不是Bob。它只是鲍勃的抽象(即它描述了鲍勃)。Person
类和Person.prototype
对象都是Bob的概括(或代表Bob的对象的抽象)。因此,对象是现实世界实体的抽象,类和原型都是概括(即抽象的抽象)。
经典语言和原型语言之间的区别在于,在经典语言中,对象只是现实世界实体的抽象。类用于创建对象或其他类的抽象。
在原型语言中,对象是现实世界实体和其他对象的抽象。当一个对象是另一个对象的抽象时,它就被称为原型对象。
因此,从某种意义上说,原型和类是双重概念。它们代表相同的东西(即概括)。这就是为什么它们是同构的。
因为你所引用的构造函数及其方法的“总体”本质上是一个原型对象,所以它可以简单地称为“原型”,也可以称为“类”。但是,它不能被称为构造函数(它只是整体的一部分)。