【问题标题】:Creating local state for object oriented programming in javascript在 javascript 中为面向对象编程创建本地状态
【发布时间】:2010-10-17 09:36:05
【问题描述】:

我对 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 不是函数。谁能看到这里有什么问题?我肯定在这里遗漏了一些东西,当然,道格拉斯·克罗克福德在这件事上不可能如此公然不正确。

编辑: 当我发布代码 sn-p 时已是深夜,我犯了一些语法错误。很抱歉浪费了您的时间。这是我遇到问题的实际代码的 sn-p。

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) is undefined”: console.log(moveGen.getNextMoveValues(STARTING_BOARD, true).response);

【问题讨论】:

  • 您不应该使用a.publicMethod1() 而不是Class.publicMethod1() 吗? (别再崇拜某个随便的人了,这不会让你看起来很聪明)
  • 道格拉斯·克罗克福德不是随便的人。是 javascript 的半神……或者类似的东西……
  • @petraszd:没听说过他。
  • @Matti Virkkunen:并不意味着他不重要或不知名:en.wikipedia.org/wiki/Douglas_Crockford
  • @Matti Virkkunen:但知道也无妨。将功劳归功于应得的人是一件好事。无论如何......没关系。

标签: javascript oop object


【解决方案1】:

您的语法无效:

 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的信息。

【讨论】:

    【解决方案2】:
    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* 的范围。

    【讨论】:

    • 感谢您的帮助。该错误并非源于任何私有功能,而是源于公共功能。更具体地说,评估者抱怨我的一个公共函数未定义。
    【解决方案3】:

    您需要了解对象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!)
        };                                 // }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2013-10-25
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多