30

我想知道函数和类之间有什么区别。都使用关键字function,这两者有明显区别吗?

4

7 回答 7

38

从技术上讲,没有类,它们都只是函数。任何函数都可以使用关键字作为构造函数调用,new并且该函数的原型属性用于对象继承方法。

“类”仅在概念上用于描述上述做法。

因此,当有人对您说“创建一个颜色类”或其他什么时,您会这样做:

function Color(r, g, b) {
    this.r = r;
    this.g = g;
    this.b = b;
}

Color.prototype.method1 = function() {

};

Color.prototype.method2 = function() {

};

当你分解它时,只有一个函数和一些prototype对该函数调用的属性的分配,所有通用的 javascript 语法,没有什么特别的。

当你说的时候,这一切都变得有点神奇var black = new Color(0,0,0)。然后,您将获得一个具有属性.r.g的对象.b。该对象还将有一个隐藏的 [[prototype]] 链接到Color.prototype. 这意味着您可以说black.method1()即使对象.method1()中不存在black

于 2012-08-15T13:29:42.400 回答
23
于 2017-08-18T14:46:37.063 回答
7

在 javascript 中,没有类。javascript 使用原型继承而不是基于类的继承。很多人会提到javascript中的类,因为它更容易理解,但这纯粹是一个类比。

在基于类的继承中,您创建一个类(如果您愿意的话,是一个“蓝图”),然后从该类实例化对象。

在原型继承中,一个对象直接从另一个父对象实例化,而不需要任何“蓝图”。

有关类与原型继承的更多信息,请参阅维基百科页面

于 2012-08-15T13:43:55.200 回答
5

function构造函数和构造函数的区别class

javascript中的class关键字与构造函数非常相似,方式如下:

  • 他们都使用javascript的原型继承系统
  • 它们都用于创建具有以下语法的对象:new myObj(arg1, arg2)

构造函数和类非常相似,通常可以根据偏好互换使用。但是,javascript 对类的私有字段是构造函数无法实现的功能(没有范围黑客)

例子:

class PersonClass {
  constructor(name) {
    this.name = name;
  }
  
  speak () { console.log('hi'); }
}

console.log(typeof PersonClass); 
// logs function, a class is a constructor function under the hood.

console.log(PersonClass.prototype.speak);
// The class's methods are placed on the prototype of the PersonClass constructor function

const me = new PersonClass('Willem');

console.log(me.name); 
// logs Willem, properties assinged in the constructor are placed on the newly created object


// The constructor function equivalent would be the following:
function PersonFunction (name) {
  this.name = name;
}

PersonFunction.prototype.speak = function () { console.log('hi'); }

于 2019-06-07T07:55:55.353 回答
1

班级

一个类声明的作用域是它的包含块。在同一个块中声明一个类名两次是错误的。类定义没有被提升。

功能

函数声明是严格模式下的块作用域。

下表总结了类和函数之间的区别 在此处输入图像描述

于 2020-01-26T11:57:13.667 回答
1

本次演讲强调了函数和类之间的一个关键区别,这表明函数是可以携带数据的行为,而相反,类是可以携带行为的数据。

于 2017-04-05T11:28:53.960 回答
0

术语通常用于面向对象的编程语言上下文中。类是将在实例化时创建的对象的模板。JavaScript 是一种基于原型的编程语言,因此使用术语类来描述 JavaScript 原型有点奇怪。在 JavaScript 中,原型被创建为函数

于 2012-08-15T13:36:39.700 回答