关于JavaScript中的功能OOP样式的问题

时间:2010-01-04 12:31:02

标签: javascript oop coding-style

我更喜欢为我的代码使用函数OOP样式(类似于模块模式),因为它有助于我避免使用“new”关键字以及回调中“this”关键字范围的所有问题。

但是我遇到了一些小问题。我想使用以下代码创建一个类。

namespace.myClass = function(){
  var self = {},
      somePrivateVar1;

  // initialization code that would call
  // private or public methods
  privateMethod();
  self.publicMethod(); // sorry, error here

  function privateMethod(){}

  self.publicMethod = function(){};

  return self;
}

问题是我无法从初始化代码中调用公共方法,因为这些函数尚未定义。显而易见的解决方案是创建一个init方法,并在“return self”行之前调用它。但也许你知道一个更优雅的解决方案?

另外,你通常如何处理这种模式的继承?我使用以下代码,但我想听听您的想法和建议。

namespace.myClass2 = function(){
  var self = namespace.parentClass(),
      somePrivateVar1;            

  var superMethod = self.someMethod;
  self.someMethod = function(){
    // example shows how to overwrite parent methods
    superMethod();
  };

  return self;
}

编辑。 对于那些询问选择这种OOP风格的原因的人,您可以查看以下问题:

4 个答案:

答案 0 :(得分:2)

您可以使用Zet.js库来帮助您按照自己的方式声明课程。

答案 1 :(得分:1)

我遇到了几个问题,例如为什么要避免使用new运算符,以及为什么要在定义函数之前调用函数。但是,将这些放在一边,如何更像下面的内容?

namespace.myClass = function(){
  var somePrivateVar1;
  var self = {};

  // initialization code that would call
  // private or public methods
  privateMethod();
  publicMethod();

  function privateMethod(){}
  function publicMethod(){}

  self.publicMethod = publicMethod;
  return self;
}

答案 2 :(得分:0)

我同意到目前为止提供的几乎所有评论或答案,但是让蒂姆的答案更进一步 - 他质疑为什么你想在定义之前调用一个方法,但无论如何都提供了一个解决方案,而我是建议你在定义之前不应该调用(我不知道在定义它之前调用方法的任何语言,或者至少声明它被认为是一种好的做法),那么如何:

namespace.myClass = function(){  
  //declare private vars (and self) first
  var self = {},  
      somePrivateVar1;  

  //then declare private methods
  function privateMethod(){}  

  //then public/privileged methods
  self.publicMethod = function(){};  

  // THEN (and only then) add your 
  // initialization code that would call  
  // private or public methods  
  privateMethod();  
  self.publicMethod(); // no error any more

  //then return the new object
  return self;  
} 

为什么这对你不起作用有特殊原因吗?

答案 3 :(得分:0)

这是我在问题中提到的解决方案。欢迎您提出意见。

namespace.myClass = function(){
  var self = {},
      somePrivateVar1;

  function init(){
    privateMethod();
    self.publicMethod();
  }

  function privateMethod(){}
  self.publicMethod = function(){};

  init();
  return self;
}