似乎有许多不同的方法在
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)为什么这是一个好主意对同事.