跳至正文
首页 » 博客 » Two Problems of a JavaScript Class

Two Problems of a JavaScript Class

从ECMA 6开始,JavaScript有class关键字来创建一个类。我在这里写了详细的课。没有第二个问题,类简化了对象的创建方式,继承实现等。JavaScript类具有,

  • 构造函数
  • 方法
  • 延伸等。

类的上述功能有助于轻松编写面向对象的JavaScript。作为开发人员,您不需要了解原型链的复杂性,函数构造函数与其原型对象之间的关系以及对象的 __proto __ 属性的值等,就可以编写有效的面向对象的JavaScript。所以,类关键字是很好的除了JavaScript语言,但它不是福音完美。它有一些问题,这可能会限制您编写完整的面向对象的JavaScript。在这篇文章中,我将分享两个这样的问题。一起读,

没有静态成员属性的类

静态成员属性由类的所有对象实例共享。JavaScript类不允许在类中创建它。

您不能直接在类中声明属性。您只能通过类的构造函数,并且在构造函数中创建的属性是对象实例的本地属性,而不是由所有对象共享。

 { var a = 9; // 意外的标识符错误} 

上面的代码将抛出错误 “ 意外标识符 ”。有一个工作来使用类原型创建静态属性。

班级发言人 {构造函数 (名称) {Speaker.prototype.count;这个 .name = 名称;}}Speaker.prototype.count = 0; 

现在在Speaker类的实例上,您可以访问静态属性计数。

var a = 扬声器 ('dj' );var b = 扬声器 ('Jason' ); console.log(a.count); // 2console.log(b.count); // 2console.log(a.count === b.count) // true 

因此,您可以创建一个静态属性,但不是没有帮助的理解原型。在我看来,类应该有一种方法直接在类中创建静态属性,如方法或构造函数。

对象实例不复制定义从类

为了理解这个问题,让我们首先修改构造函数调用模式和原型链。你有一个函数构造函数扬声器。

功能扬声器 (名称) {这个 .name = 名称;这个 .hello = 函数 () {console.log (这个 'hey '.name);}} 

使用new运算符,您可以创建对象实例,

var a = 扬声器 ('dj' );// hello(); 嘿djvar b = 扬声器 (“ jason' ”);b.hello(); // hey Jason 

在这种方法中,a和b对象实例都有自己的hello方法副本。现在,如果你添加一个hello方法Speaker.prototype,仍然a和b对象实例将访问自己的hello方法的副本。考虑下面的代码:

Speaker.prototype.hello = function () {console.log (这个 .name 'Hello Speaker ');} // hello(); 嘿djb.hello(); // 嘿Jasona.__Proto __.hello.ca ll(a); 

// 你好演讲者DJ

您在调用hello方法时获得预期的输出,并调用扬声器原型的hello方法使用 __proto __。

现在让我们使用类实现上述场景。

班级发言人 { 构造函数 (名称) {这个 .name = 名称;}hello() {console.log (这个 'hey '.name);}} 

我们使用构造函数和实例方法hello创建了Speaker类。让我们创建Speaker类的对象实例,

var a = 扬声器 ('dj' );// hello(); 嘿djvar b = 扬声器 (“ jason ”);b.hello(); // hey Jason 

到目前为止,一切都如预期。现在继续并添加相同的功能hello扬声器原型。

Speaker.prototype.hello = function () {console.log (这个 .name 'hello speaker ');} 

将函数hello添加到speaker原型后,使用Speaker的对象实例调用hello函数。

a.hello(); // hello speaker djb.hello(); // hello speaker jason 

您会惊讶地发现,对象实例a和b现在正在调用扬声器原型的hello函数,而不是它们自己的hello函数。

这是因为JavaScript类不像面向对象语言的真正类。它不会在对象中创建类声明的副本。它仍在使用基于 [[原型]] 的实时委托模型

此外,上面两个问题在课堂上,还有其他的。一个与超级关键字有关,我们将在进一步的文章中讨论。在决定应该使用哪一个之前,我建议你学习更多关于类,函数构造函数和原型的信息。

</p