2014-11-04 38 views
-1

在JavaScript中製作類似類的最佳方式並創建它的多個實例?JavaScript中的對象和方法

我已經試過如下:

function Test() { 
    var currentState = -1; 
    var stateArray = new Array(); 
} 

Test.prototype.SetState = function(state) { 
    this.currentState = state; 

    stateArray.push(state); 

    if (stateArray.length > 2) { 
     stateArray.splice(0, 1); 
    } 
} 

Test.prototype.GetState = function() { 
    return this.currentState; 
} 

var Object1 = new Test(); 
var Object2 = new Test(); 

var EState = { 
    ONE: 1, 
    TWO: 2, 
}; 

Object1.SetState(EState.ONE); //<< fails here 

它的工作原理,如果我用它來創建一個對象,但是當我創建多個對象,並使用其中的任何得到以下錯誤:

Uncaught TypeError: undefined is not a function 

什麼會導致這種行爲?

回答

2

的問題是stateArray和currentState是私有的(本地只Test())所以,當你嘗試做stateArray.push在這種情況下stateArray是不確定的,因此不會有一個名爲推送功能。解決這個問題的一種方法是使用this關鍵字

function Test() { 
 
    this.currentState = -1; 
 
    this.stateArray = new Array(); 
 
} 
 

 
Test.prototype.SetState = function(state) { 
 
    this.currentState = state; 
 

 
    this.stateArray.push(state); 
 

 
    if (this.stateArray.length > 2) { 
 
    this.stateArray.splice(0, 1); 
 
    } 
 
} 
 
Test.prototype.GetState = function() { 
 
    return this.currentState; 
 
} 
 

 
var Object1 = new Test(); 
 
var Object2 = new Test(); 
 

 
var EState = { 
 
    ONE: 1, 
 
    TWO: 2, 
 
}; 
 

 
Object1.SetState(EState.ONE); 
 
console.log(Object1);

如果您想這些是私有的,你只能從構造函數返回的公開可用的功能,讓他們測試的屬性,保持私有數據隱藏

function Test() { 
 

 
    //private 
 
    var currentState = -1; 
 
    var stateArray = new Array(); 
 
    //public 
 
    return { 
 
    SetState: function(state) { 
 
     currentState = state; 
 
     stateArray.push(state); 
 
     if (stateArray.length > 2) { 
 
     stateArray.splice(0, 1); 
 
     } 
 
    }, 
 
    GetState: function() { 
 
     return currentState; 
 
    } 
 
    } 
 
} 
 

 

 

 
var Object1 = new Test(); 
 
var Object2 = new Test(); 
 

 
var EState = { 
 
    ONE: 1, 
 
    TWO: 2, 
 
}; 
 

 
Object1.SetState(EState.ONE); 
 
Object2.SetState(EState.TWO); 
 
console.log(Object1.GetState()); 
 
console.log(Object2.GetState());

+0

謝謝您發現我的錯字。我剛剛刪除了我的其他帖子,因爲沒有人需要這個網站受到一堆錯字問題的污染。但是我通過閱讀你的其他一些帖子,併爲那些值得加入的人+1以及他們自己獨立的獨立優點表示感謝。 – CodeMed 2014-11-05 21:42:52