这是我开始将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]);
},
}
最佳答案
不能完全确定您的目标是什么,但是如果属性是真正动态的并且必须在运行时进行评估,则Screeps的运行时将支持Proxy
对象。
它的作用是允许您以编程方式拦截对象的所有消息,包括访问属性。
关于javascript - 原型(prototype)所有可能子属性的访问者,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41212242/