2012-07-26 54 views
1

我是OOP的JavaScript新手。出於測試目的,我創建了以下代碼片段。我創建了四個按鈕,在點擊每個按鈕時,它會發揮不同的功能。當我第一次點擊任何按鈕時,它會給出預測結果。在單擊任何第二次的按鈕,它給了我下面的錯誤:Javascript新操作人員

classFunction = new classFunction(); 

我已經使用的代碼如下:

<html> 
    <head> 
    <script type="text/javascript"> 
     var classFunction; 

     function classFunction() { 
     this.publicVariable = 'Public Varibale'; 
     var privateVariable = 'Private Variable'; 

     this.publicMethod = function() { 
      alert('Public Method'); 
     } 

     function privateMethod() { 
      alert('private Method'); 
     } 

     return this; 
     } 

     function privateVariable() { 
     classFunction = new classFunction(); 
     alert(classFunction.privateVariable); 
     } 

     function publicvariable() { 
     classFunction = new classFunction(); 
     alert(classFunction.publicVariable); 
     } 

     function privateFunction() { 
     classFunction = new classFunction(); 
     classFunction.privateMethod(); 
     } 

     function publicFunction() { 
     classFunction = new classFunction(); 
     classFunction.publicMethod(); 
     } 
    </script> 
    </head> 

    <body> 
    <input type="button" value="Private Variable" onclick="privateVariable()" /> 
    <input type="button" value="Public Variable" onclick="publicvariable()" /> 
    <input type="button" value="Private Function" onclick="privateFunction()" /> 
    <input type="button" value="Public Function" onclick="publicFunction()" /> 
    </body> 
</html> 

是否有任何理由,新運營商將不再工作?

+0

看看我是如何做到這一點:http://jsfiddle.net/gRoberts/CDhFp/1/ – Gavin 2012-07-26 10:59:54

+2

隨着'classFunction =新classFunction();'你要重寫classFunction'的'全球價值因此第二次調用該函數'classFunction'是原始'classFunction'的一個實例,請嘗試使用'var'關鍵字並使用不同的名稱,如'var someInstance = new classFunction();'。 – Prusse 2012-07-26 11:00:36

+0

順便說一句,你不能調用'.privateMethod'只在閉包內聲明,並且不在外部可用。嘗試谷歌'關閉範圍javascript' =) – Prusse 2012-07-26 11:03:56

回答

1

原因是因爲你的變量名和構造函數名是相同的。因此,當您第一次創建新實例並將其分配給變量時,類將被實例覆蓋。

確保您以不同的方式命名。

var classFunction; 
function classFunction() 
+0

謝謝Ramesh。這是一個很大的幫助。 – vvekselva 2012-07-26 11:21:46

1

通過重用名稱classFunction作爲變量名覆蓋構造函數。規範是JS是大寫構造函數,如下所示:ClassFunction這可能會有所幫助。

+0

謝謝Scott Sauyet。有效。 – vvekselva 2012-07-26 11:21:23