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

5 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;
}
Run Code Online (Sandbox Code Playgroud)

问题是我无法从初始化代码中调用公共方法,因为这些函数尚未定义.显而易见的解决方案是创建一个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;
}
Run Code Online (Sandbox Code Playgroud)

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

Gra*_*aza 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;  
} 
Run Code Online (Sandbox Code Playgroud)

有什么特殊原因导致这对您不起作用吗?