2016-12-18 5 views
1

Это код, я начинаю с прототипом goal в Creep класс:прототипирования аксессоров всех возможных подсвойств

Object.defineProperty(
Creep.prototype,"goal",{ 
    set :function(value){ 
     this.memory.goal= value.id; 
    }, 
    get :function() { 
     return Game.getObjectById(this.memory.goal); 
    }, 
} 
) 

Теперь давайте предположим, что я хочу Creep.goal не должны содержать одно значение, но несколько значений, и пусть каждый отдельный под-свойства Creep.goal имеют указанные выше аксессоры. (Так что я могу легко хранить несколько игровых объектов в память ползучести в)

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

Как следует действовать, чтобы определить аксессоров все возможные Свойства объекта?

----- РЕШЕНИЕ -----

Так что я предложил использовать Proxy для этого. Для меня это была совершенно новая концепция, и я ударил по множеству стен, но мне нужно работать, как хотелось!

// Prototyping goal as a proxy 
Object.defineProperty(
    Creep.prototype,"goal",{ 
     get :function() 
      {return new Proxy(this.memory.goal, objectInMemory) } 
    } 
) 

// Proxy's Handler (my previous accessors) 
const objectInMemory= { 
    set(goal, property, value){ 
     goal[property] = value.id; 
     return true; 
    }, 
    get(goal, property){ 
     return Game.getObjectById(goal[property]); 
    }, 
} 

ответ

0

Не совсем уверен, что вы стремитесь, но если свойства действительно динамичны и должны быть оценены во время выполнения есть Proxy объекты, которые поддерживаются выполнения Screeps'.

Что это значит, это позволяет программно перехватывать все сообщения для объекта, включая доступ к свойствам.

+0

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

+0

Я пропустил большую часть фона screeps, чтобы попытаться не уклониться от точки, но вернуть ее в контекст: я создал набор аксессуаров, которые помогут мне хранить и восстанавливать игровые объекты в/из памяти ползучести без нужно набирать roomObject.id или Game.getObjectById() каждый раз. – Estecka

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