使用原型JavaScript - 最佳实践

hwc*_*rwe 9 javascript oop prototype

目前我正在开发一个我们正在编写面向对象的JavaScript的项目.在这个项目中,我看到了两种不同的定义类的方法:

1:在原型上一次声明函数

My.Namespace.ClassName = function(param1, param2) {
   this.member1 = param1;
   this.member2 = param2;
};

My.Namespace.ClassName.prototype = {
   myFunction1: function() {
      return this.member1 + " " + this.member2;
   },

   myFunction2: function(param1) {
      this.member3 = paraml;
   }
};
Run Code Online (Sandbox Code Playgroud)

2:准备原型上的每个功能

My.Namespace.ClassName = function(param1, param2) {
   this.member1 = param1;
   this.member2 = param2;
};

My.Namespace.ClassName.prototype.myFunction1 = function() {
   return this.member1 + " " + this.member2;
};

My.Namespace.ClassName.prototype.myFunction2 = function(param1) {
   this.member3 = paraml;
};
Run Code Online (Sandbox Code Playgroud)

基于两个给定的示例,JavaScript的行为方式有什么不同,还是仅仅是样式差异?

就个人而言,我没有看到任何行为差异,但我觉得必须有一个微妙的差异,我目前缺少.

除此之外.我想知道这是一种常见的做法,还是有更好的方法来定义类.

Sci*_*ter 8

有一个微妙的区别.在第一种方法中,当你覆盖原型时,那里有一个现在丢失的属性.这就是constructor,它指向你的功能.构造函数允许您重新创建它的对象类型.

您可以轻松地将其取回,因此可以通过手动设置它来使用第一种方法:

My.Namespace.ClassName.prototype = {
   myFunction1: function() {
      return this.member1 + " " + this.member2;
   },

   myFunction2: function(param1) {
      this.member3 = paraml;
   },
   constructor: My.Namespace.ClassName
};
Run Code Online (Sandbox Code Playgroud)

另见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor