我想知道函数和类之间有什么区别。都使用关键字function,这两者有明显区别吗?
7 回答
从技术上讲,没有类,它们都只是函数。任何函数都可以使用关键字作为构造函数调用,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
。
在 javascript 中,没有类。javascript 使用原型继承而不是基于类的继承。很多人会提到javascript中的类,因为它更容易理解,但这纯粹是一个类比。
在基于类的继承中,您创建一个类(如果您愿意的话,是一个“蓝图”),然后从该类实例化对象。
在原型继承中,一个对象直接从另一个父对象实例化,而不需要任何“蓝图”。
有关类与原型继承的更多信息,请参阅维基百科页面。
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'); }
本次演讲强调了函数和类之间的一个关键区别,这表明函数是可以携带数据的行为,而相反,类是可以携带行为的数据。
术语类通常用于面向对象的编程语言上下文中。类是将在实例化时创建的对象的模板。JavaScript 是一种基于原型的编程语言,因此使用术语类来描述 JavaScript 原型有点奇怪。在 JavaScript 中,原型被创建为函数