Создание локального состояния для объектно-ориентированного программирования в JavaScript - PullRequest
0 голосов
/ 17 октября 2010

Я относительно новичок в 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, true) is undefined» при выполнении следующей команды: console.log (moveGen.getNextMoveValues ​​(STARTING_BOARD,правда) .response);

Ответы [ 3 ]

2 голосов
/ 17 октября 2010

Ваш синтаксис неверен:

 return {
  var publicVar1,
   publicVar2;

  publicMethod1: function () {
  }

  publicMethod2: function() {
  }
 }; 

должно быть

 return {
  publicVar1,
  publicVar2,  
  publicMethod1: function () {},
  publicMethod2: function() {}
 }; 

Вы используете здесь литерал объекта, который всегда имеет вид:

{member: value, member: value}

, где value также можно опустить: {member, member: value}


Подробнее о инициализаторах объекта .

0 голосов
/ 17 октября 2010

Вам необходимо понять объект буквенное обозначение .

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!)
    };                                 // }
}
0 голосов
/ 17 октября 2010
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*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...