原型化所有可能的子属性的访问器
Prototyping the accessors of ALL POSSIBLE sub-properties
这是我开始将 goal
原型化为 Creep
class:
的代码
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
的每个子属性都具有上述访问器。
(所以我可以轻松地将多个游戏对象存储到 creep 的内存中)
这些属性是要在运行时添加的,所以我不知道会有多少,也不知道它们的名字,因此我不能简单地复制粘贴这段代码每 属性 我希望有一次。
我应该如何进行才能定义对象的所有可能属性的访问器?
----- 解决方案 -----
所以有人建议我为此使用 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
个对象。
它的作用是允许您以编程方式拦截对象的所有消息,包括访问属性。
这是我开始将 goal
原型化为 Creep
class:
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
的每个子属性都具有上述访问器。
(所以我可以轻松地将多个游戏对象存储到 creep 的内存中)
这些属性是要在运行时添加的,所以我不知道会有多少,也不知道它们的名字,因此我不能简单地复制粘贴这段代码每 属性 我希望有一次。
我应该如何进行才能定义对象的所有可能属性的访问器?
----- 解决方案 -----
所以有人建议我为此使用 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
个对象。
它的作用是允许您以编程方式拦截对象的所有消息,包括访问属性。