2014-11-04 15 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

 Смежные вопросы

  • Нет связанных вопросов^_^