我更喜欢为我的代码使用函数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风格的原因的人,您可以查看以下问题:
答案 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;
}