【发布时间】:2010-01-04 12:31:02
【问题描述】:
我更喜欢对我的代码使用函数式 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 风格的原因的人,您可以查看以下问题:
【问题讨论】:
-
不使用语言提供的技术通常是一个坏的想法。这意味着您不应该规避
new,这正是它在 Javascript 中完成的方式,它可能是在这种特定语言中的最佳方式。 -
为什么不能在顶部定义方法,然后再尝试调用它们?
-
请记住,除非您引入“特权”getter 和 setter 方法,否则您将无法从后代类访问父类中的“私有”变量。 myClass2 中的“somePrivateVar1”将是 myClass1 中同名 var 的单独变量,其中一个变量的任何更改都不会反映在另一个变量中。这可能会给您带来很多困惑。
-
关于被覆盖的方法,你实际上想要实现什么?到目前为止,您看起来还不错,尽管我可能会建议为“超级”方法添加私有名称空间(例如: var superMethods = {}; superMethods.someMethod = self.someMethod; self.someMethod = function(){ superMethods .someMethod(); //... }) 或者您是否正在寻找一种方法来自动在新覆盖的方法中包含对 superMethod 的调用?
-
我试图了解这种方法的实用性。那里没有更高阶的程序,实际上有很多突变。更不用说由于对象突变导致的主要问题是执行顺序。
标签: javascript oop coding-style