2010-10-17 28 views
0

我相对较新的JavaScript,并且我观看了道格拉斯克罗克福德关于这个主题的两个教程视频。他建议以下列方式创建在JavaScript面向对象的设计,通过使用匿名函数和闭包:在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,真)是未定义”当我执行以下命令: 的console.log(moveGen.getNextMoveValues(STARTING_BOARD,真)。响应);

+0

难道你不应该''a.publicMethod1()'而不是'Class.publicMethod1()'? (并且不要让偶然的偶像化,它不会让你看起来很聪明) – 2010-10-17 09:48:57

+1

道格拉斯克罗克福德不是一些随机的人。是javascript的半神...或者类似的东西... – petraszd 2010-10-17 09:51:33

+0

@petraszd:从未听说过他。 – 2010-10-17 09:52:09

回答

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*和​​不是刚刚返回的对象的成员。它们是只能由返回对象访问的变量和/或函数(闭包)。只有返回的对象可以访问定义范围privateVar*和​​。

+0

感谢您的帮助。错误不是来自任何私人功能,而是公共功能。更具体地说,评估者抱怨我的一个公共职能未定义。 – Sam 2010-10-17 18:24:56

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!) 
    };         // } 
} 
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