在javascript中为面向对象编程创建本地状态

时间:2010-10-17 09:36:05

标签: javascript oop object

我对javascript相对较新,我观看了Douglas Crockford关于此主题的两个教程视频。他建议通过使用无名函数和闭包,以下列方式在javascript中创建面向对象的设计:

function Class() {
 var privateVar1,
  privateVar2;

 function privateMethod1() {
 }

 function privateMethod2() {
 }

 return {
  var publicVar1,
   publicVar2;

  publicMethod1: function () {
  }

  publicMethod2: function() {
  }
 }; 
}

这里遇到的麻烦是我创建一个新课程,比如

var a = Class();

当我尝试使用我在类定义中返回的对象文字中声明的公共方法时,我遇到错误。更具体地说,我得到错误 Class.publicMethod1不是函数。有谁能看到这里有什么问题?我肯定会在这里遗漏一些东西,肯定道格拉斯克罗克福德不能对此公然不正确。

编辑: 当我发布那段代码片段时,已经是深夜了,我犯了一些语法错误。抱歉浪费了你的时间。这是我遇到问题的实际代码的片段。

return {
//public methods
getNextMoveValues: function(board, player) { 
    currentBoard = board; 
    if(isBoardValid()) {
        var completeURL = assembleString(board, player);    
        return queryServer(completeURL);
    } else {
        console.err("board arg not valid in MoveGenerator::getNextMoveValues"); 
    }
},

toString: function () {
    var rtn = "currentPlayer: " + currentPlayer + "\t" + "currentBoard: " +      
    currentBoard + "\t" + "gameOption:" + gameOption + "\n";
    return rtn; 
}
};

当我运行代码时,我得到的唯一错误是“moveGen.getNextMoveValues(STARTING_BOARD,true)未定义”当我执行以下命令时:     console.log(moveGen.getNextMoveValues(STARTING_BOARD,true).response);

3 个答案:

答案 0 :(得分:2)

您的语法无效:

 return {
  var publicVar1,
   publicVar2;

  publicMethod1: function () {
  }

  publicMethod2: function() {
  }
 }; 

应该是

 return {
  publicVar1,
  publicVar2,  
  publicMethod1: function () {},
  publicMethod2: function() {}
 }; 

您在此处使用的是对象文字,其格式始终为:

{member: value, member: value}

其中value也可以省略:{member, member: value}


详细了解object initializers

答案 1 :(得分:0)

function Class(arg1, arg2) {
  var privateVar1 = arg1,
      privateVar2;

  function privateFunction1() {
    // use arg2
  }

  function privateFunction2() { 
  }

  return {
    publicVar1: 'something',
    publicVar2: 'something',
    publicMethod1: function () { },
    publicMethod2: function() { }
  }
}

重点是privateVar*privateFunctions*不是刚刚返回的对象的成员。它们是只能由返回的对象访问的变量和/或函数(闭包)。只有返回的对象才能访问定义privateVar*privateFunctions*的范围。

答案 2 :(得分:0)

您需要了解对象literal notation

function Class() {

    var privateVar1, privateVar2;

    function privateMethod1() {}
    function privateMethod2() {}

    return {                           // {
        publicVar1: "value",           // name: value,
        publicVar2: 5,                 // name: value,
        publicMethod1: function () {}, // name: value,
        publicMethod2: function () {}  // name: value (no comma at the end!)
    };                                 // }
}