代码之家  ›  专栏  ›  技术社区  ›  Estecka

原型化所有可能子属性的访问器

  •  1
  • Estecka  · 技术社区  · 8 年前

    这是我开始制作原型的代码 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 不包含单个值,而是包含多个值,并让 爬行 具有上述访问器。 (因此,我可以轻松地将多个游戏对象存储到怪物的内存中。)

    不要 知道会有多少,也不知道他们的名字,因此我不能简单地为我想要的每个属性复制粘贴一次代码。

    如何定义的访问器 一切可能 对象的属性?

    -----解决方案-----

    所以有人建议我使用 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 回复  |  直到 8 年前
        1
  •  0
  •   Filip Dupanović    8 年前

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

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