gpt4 book ai didi

javascript - JavaScript "class"的规范术语

转载 作者:行者123 更新时间:2023-11-28 15:29:45 27 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

7年前关闭。




Improve this question




这是一个在 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 中的等价术语是什么?

最佳答案

JavaScript 没有类,但我仍将其称为类。 ECMAScript Harmony 将介绍 classes到 JavaScript(尽管它们不是真正的类)。这就是您的代码在 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函数接受一个原型(prototype)对象并返回一个“类”。每个类都必须有一个构造函数。

面向对象的编程语言有两种类型:经典语言和原型(prototype)语言。

类和原型(prototype)是同构的(即原型(prototype)可以转换为类,类可以转换为原型(prototype))。有关详细信息,请参阅以下问题的答案:

How to achieve pseudo-classical inheritance right on the class declaration?

原型(prototype)类同构



上图取自以下问题的答案:

JavaScript inheritance and the constructor property

在您的问题中,您要求一个描述构造函数及其方法的整体的术语。

构造函数及其方法都是原型(prototype)对象的属性。因此,总体的规范术语是“原型(prototype)”。

然而,由于原型(prototype)和类是同构的,你也可以称它为“类”。

以下问题的答案解释了原型(prototype)如何与类同构:

classical inheritance vs protoypal inheritance in javascript

回顾一下,您要求的术语是“原型(prototype)”。原型(prototype)与类同构。因此,您也可以将其称为“类”。原型(prototype)有一个构造方法,通常用于创建原型(prototype)的实例。构造函数不是整体,而是整体的一部分。

原型(prototype)与类

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

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

简要解释抽象和概括:
  • 对象是现实世界实体的抽象。例如 Bob 是一个真实世界的实体。在计算机程序中,Bob 使用具有 name 等属性的对象来表示。和 gender .这个对象不是 Bob。它只是 Bob 的抽象(即它描述了 Bob)。
  • 抽象的抽象是概括。在古典语言中,泛化是使用类来表示的。在原型(prototype)语言中,泛化是使用原型(prototype)对象表示的。例如,Person类和 Person.prototype object 都是 Bob 的概括(或表示 Bob 的对象的抽象)。

  • 因此,对象是现实世界实体的抽象,类和原型(prototype)都是泛化(即抽象的抽象)。

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

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

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

    因为您所指的构造函数及其方法的“整体”本质上是一个原型(prototype)对象,所以它既可以简单地称为“原型(prototype)”,也可以通过扩展称为“类”。但是,它不能称为构造函数(它只是整体的一部分)。

    关于javascript - JavaScript "class"的规范术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27821397/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com