JavaScript 没有类,但我仍然称其为类。 ECMAScript Harmony 将推出classes http://wiki.ecmascript.org/doku.php?id=strawman:maximally_minimal_classesJavaScript(尽管它们不是真正的类)。这是您的代码在 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
函数接受一个原型对象并返回一个“类”。每个类都必须有一个构造函数。
面向对象的编程语言有两种类型:经典语言和原型语言。
类和原型是同构的(即原型可以转换为类,类也可以转换为原型)。有关更多详细信息,请参阅以下问题的答案:
如何在类声明上实现伪经典继承? https://stackoverflow.com/q/18753802/783743
原型类同构
上图取自对以下问题的回答:
JavaScript 继承和构造函数属性 https://stackoverflow.com/q/8093057/783743
在您的问题中,您要求一个术语来描述构造函数及其方法的整体。
构造函数及其方法都是原型对象的属性。因此,整体的规范术语是“原型”。
但是,由于原型和类是同构的,因此您也可以将其称为“类”。
以下问题的答案解释了原型如何与类同构:
JavaScript 中的经典继承与原型继承 https://stackoverflow.com/q/19633762/783743
回顾一下,您要求的术语是“原型”。原型与类同构。因此你也可以将其称为“类”。原型有一个构造函数方法,通常用于创建原型的实例。构造函数不是整体,而是整体的一部分。
原型与类
到目前为止,我只指出原型与类同构,而没有说明如何同构,因为我不想重复我之前的答案。然而,一些重复是好的。
正如我之前所说,面向对象语言有两种类型:经典语言和原型语言。在古典语言中,有两个独立的事物:抽象(对象)和泛化(类)。
简单解释一下抽象和泛化:
- 对象是现实世界实体的抽象。例如,鲍勃是一个现实世界的实体。在计算机程序中,Bob 使用具有以下属性的对象来表示
name
and gender
。这个对象不是鲍勃。它只是 Bob 的抽象(即它描述了 Bob)。
- 抽象的抽象是概括。在经典语言中,泛化是用类来表示的。在原型语言中,泛化是使用原型对象来表示的。例如,
Person
类和Person.prototype
object 都是 Bob 的概括(或者代表 Bob 的对象的抽象)。
因此,对象是现实世界实体的抽象,类和原型都是泛化(即抽象的抽象)。
经典语言和原型语言之间的区别在于,在经典语言中,对象只是现实世界实体的抽象。类用于创建对象或其他类的抽象。
在原型语言中,对象是现实世界实体和其他对象的抽象。当一个对象是另一个对象的抽象时,它被称为原型对象。
因此,从某种意义上说,原型和类是双重概念。它们代表同一件事(即概括)。这就是为什么它们是同构的。
因为您所引用的构造函数及其方法的“整体”本质上是一个原型对象,所以它可以简单地称为“原型”,也可以扩展为“类”。然而,它不能被称为构造函数(它只是整体的一部分)。