似乎有许多不同的方法在
JavaScript中执行OO.
我喜欢:
function ClassA(){}; ClassA.prototype={ someFunc:function(a,b,c){},otherFunc:function(){} } var c=new ClassA();
并且从未使用过超出此功能的功能(尽管是一个熟练的OOer).我怀疑这是老式的,因为我经常看到新的闪烁变体,这让我想知道我是否选择了最好的方法.例如,你可以在构造函数方法中创建魔法来创建私有变量和访问器方法,我认为(直到最近)是不可能的.子类化怎么样?我不知道如何实现这一点,但它现在必须具有某种共同模式.
你是怎么做到的,为什么?
解决方法
function foo() { var bar = function() { console.log("i'm a private method"); return 1; }; var iAmAPrivateVariable = 1; return { publicMethod: function() { alert(iAmAPrivateVariable); },publicVariable: bar() } } //usage var thing = foo()
这被称为功能性应用程序,因为您实际上正在利用闭包进行封装(这是在javascript中执行此操作的唯一方法).
一般来说,你不应该在javascript中做OO,因为很多原因,它不是那么好的语言.认为方案有波浪括号和分号,你将开始像专业人士那样编写语言.话虽如此,有时OO更合适.在这些情况下,上述通常是最好的选择
编辑:将继承带入混合
function parent() { return { parentVariable: 2 }; } function foo() { var bar = function() { console.log("i'm a private method"); return 1; }; var iAmAPrivateVariable = 1; me = parent(); me.publicMethod = function() { alert(iAmAPrivateVariable); }; me.publicVariable = bar(); return me; }
这使得事情变得更加复杂,但是在仍然采用OO概念的功能方法(在这种情况下,使用装饰器函数而不是真正的继承)的同时实现了期望的最终结果.我对整个方法的喜欢之处在于,我们仍然按照这种语言的方式处理对象 – 您可以随意附加内容.
EDIT2:
只是想在信用到期时给予信任,这种方法对于doug crockford在Javascript:The Good Parts中的建议略有简化.如果你想把你的js技能提升到一个新的水平,我强烈建议从那里开始.我不认为我从这么小的书中学到了很多东西.
另一个注意事项是,这与你在大多数工作中大部分时间都会看到的情况截然不同,往往很难解释a)发生了什么,以及b)为什么这是一个好主意对同事.