2016-12-22 1 views
1

я сделал небольшую песочницу с помощью p5.js библиотеки: http://gosuness.free.fr/balls/для (вар о в этом) внутри объекта

Я пытаюсь реализовать способ борьбы с опционами на стороне, которая переключаются с помощью сочетаний клавиш.

Это то, что я пытался сделать:

var options = 
{ 
    Option: function(name, value, shortcut) 
    { 
     this.name = name; 
     this.shortcut = shortcut; 
     this.value = value; 
     this.show = function() 
     { 
      var texte = createElement("span",this.name + " : " + this.shortcut + "<br />"); 
      texte.parent("options"); 
      texte.id(this.name); 
     } 
    }, 

    toggle: function(shortcut) 
    { 
     for (var o in this) 
     { 
      console.log(o); 
      if (o.shortcut == shortcut) 
      { 
       o.value = !o.value; 
       changeSideText("#gravity",gravity); 
       addText("Toggled gravity"); 
      } 
     } 
    } 
}; 

Я экземпляр каждого параметра внутри параметров объекта таким образом:

var gravity = new options.Option("gravity", false,"G"); 
var paintBackground = new options.Option("paintBackground",false,"P"); 

Когда я вызываю функцию options.toggle, console.log(o) дает мне «Option "" переключить ". но я хочу получить for (var o in this), чтобы дать мне список свойств объектов, которые в этом случае имеют гравитацию и краску. База данных

Как это сделать?

Спасибо!

+0

'gravity' и' paintBackground' - простые переменные, а не свойства объекта 'options'. Почему вы так думали? – Bergi

ответ

0

Когда вы создаете экземпляр Option, его не сохраняют в параметрах переменной, но в предоставленной переменной.

var gravity = new options.Option("gravity", false,"G"); 

Создает экземпляр опции, находящейся под переменной гравитацией.

Ваш итератор для (var o в этом) выполняет итерации по свойствам опций, с правильным выходом методов объекта.

Если Вы хотите, чтобы ваш код, чтобы сохранить новые экземпляры опции в опции переменной, вы можете изменить код, как

var options = 
{ 
    instances: [], 
    Option: function(name, value, shortcut) 
    { 
     this.name = name; 
     this.shortcut = shortcut; 
     this.value = value; 
     this.show = function() 
     { 
      var texte = createElement("span",this.name + " : " + this.shortcut + "<br />"); 
      texte.parent("options"); 
      texte.id(this.name); 
     } 
     options.instances.push(this); 
    }, 

    toggle: function(shortcut) 
    { 
     for (var i in this.instances) 
     { 
      console.log(this.instances[i]); 
      if (this.instances[i].shortcut == shortcut) 
      { 
       this.instances[i].value = !this.instances[i].value; 
       changeSideText("#gravity",gravity); 
       addText("Toggled gravity"); 
      } 
     } 
    } 
}; 

это ваш пример работает, как вы собираетесь его, но я Wouldnt рассматривать это как надежный дизайн.

+0

Да, кроме [вы не должны использовать 'in ... en' перечисления на массивах!] (Https://stackoverflow.com/q/500504/1048572) – Bergi

+0

Я понимаю, что было не так сейчас ... и, да, я не довольный этим дизайном, я думаю, что он с самого начала испорчен, так как он прибегает к подобным трюкам. – Albizia

+0

у вас есть предложение помочь мне улучшить этот дизайн? – Albizia