这是我开始将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 :(得分:0)
不完全确定您的目标是什么,但如果属性是真正动态的并且必须在运行时进行评估,则Screeps的运行时支持Proxy
个对象。
它的作用是它允许您以编程方式拦截对象的所有消息,包括访问属性。