2010-10-17 58 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