这是我开始将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/

10-11 19:58
查看更多