Javascript OO语法

spe*_*der 6 javascript oop

似乎有许多不同的方法在JavaScript中执行OO.

我喜欢:

function ClassA(){};
ClassA.prototype={
    someFunc:function(a,b,c){},
    otherFunc:function(){}
}
var c=new ClassA();
Run Code Online (Sandbox Code Playgroud)

并且从未使用过超出此功能的功能(尽管是一个熟练的OOer).我怀疑这是老式的,因为我经常看到新的闪烁变体,这让我想知道我是否选择了最好的方法.例如,你可以在构造函数方法中创建魔法来创建私有变量和访问器方法,我认为(直到最近)是不可能的.子类化怎么样?我不知道如何实现这一点,但它现在必须具有某种共同模式.

你是怎么做到的,为什么?

Mat*_*ggs 6

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

这被称为功能性应用程序,因为您实际上正在利用闭包进行封装(这是在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;
}
Run Code Online (Sandbox Code Playgroud)

这使得事情变得更加复杂,但是在仍然采用OO概念的功能方法(在这种情况下,使用装饰器函数而不是真正的继承)的同时实现了期望的最终结果.我对整个方法的喜欢之处在于,我们仍然按照这种语言的方式处理对象 - 您可以随意附加内容.

EDIT2:

只是想在信用到期时给予信任,这种方法对于doug crockford在Javascript:The Good Parts中的建议略有简化.如果你想把你的js技能提升到一个新的水平,我强烈建议从那里开始.我不认为我从这么小的书中学到了很多东西.

另一个注意事项是,这与你在大多数工作中大部分时间都会看到的情况截然不同,往往很难解释a)发生了什么,以及b)为什么这是一个好主意对同事.


Ant*_*ton 5

简单的JavaScript继承

因为John Resig这么说.

  • 当$几乎被视为语言扩展时 (3认同)