原型化ALL POSSIBLE子属性的访问器

时间:2016-12-18 19:51:43

标签: javascript proxy prototype accessor screeps

这是我开始将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]);
    },
}

1 个答案:

答案 0 :(得分:0)

不完全确定您的目标是什么,但如果属性是真正动态的并且必须在运行时进行评估,则Screeps的运行时支持Proxy个对象。

它的作用是它允许您以编程方式拦截对象的所有消息,包括访问属性。