JavaScript“类”的规范术语

时间:2015-01-07 14:15:23

标签: javascript

这是一个简单的例子,用于在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中的等效术语是什么?

2 个答案:

答案 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有一个构造函数方法,通常用于创建原型的实例。构造函数不是整体,而是整体的一部分。

原型与类

到目前为止,我只是说原型与类同构而没有说明如何,因为我不想复制我以前的答案。但是,有些重复是好的。

正如我之前所说,有两种类型的面向对象语言:经典语言和原型语言。在经典语言中,你有两个独立的东西用于抽象(对象)和泛化(类)。

简要解释抽象和概括:

  1. 对象是现实世界实体的抽象。例如,Bob是一个真实世界的实体。在计算机程序中,Bob使用具有namegender等属性的对象来表示。这个对象不是Bob。它只是鲍勃的抽象(即它描述了鲍勃)。
  2. 抽象的抽象是一种概括。在经典语言中,使用类来表示泛化。在原型语言中,使用原型对象表示泛化。例如,Person类和Person.prototype对象都是Bob的概括(或代表Bob的对象的抽象)。
  3. 因此,对象是现实世界实体的抽象,类和原型都是概括(即抽象的抽象)。

    经典语言和原型语言之间的区别在于,在经典语言中,对象只是现实世界实体的抽象。类用于创建对象或其他类的抽象。

    在原型语言中,对象是现实世界实体和其他对象的抽象。当一个对象是另一个对象的抽象时,它就被称为原型对象。

    因此,从某种意义上说,原型和类是双重概念。它们代表相同的东西(即概括)。这就是为什么它们是同构的。

    因为你所引用的构造函数及其方法的“总体”本质上是一个原型对象,所以它可以简单地称为“原型”,也可以称为“类”。但是,它不能被称为构造函数(它只是整体的一部分)。