我对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);
答案 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!)
}; // }
}