使用原型JavaScript - 最佳实践

时间:2014-11-20 15:14:59

标签: 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;
   }
};

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;
};

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

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

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

1 个答案:

答案 0 :(得分:8)

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

您可以轻松取回它,因此请手动设置第一种方法:

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

   myFunction2: function(param1) {
      this.member3 = paraml;
   },
   constructor: My.Namespace.ClassName
};

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