当 属性 类型有自己的 'set' 时,如何在对象属性上使用 'set'?

how to use 'set' on object properties when the property type has a 'set' of it's own?

如果“_position”是 Sprite 的一个 Point 对象成员,具有 Number 成员 x 和 y,以及它自己的 get/set 定义,我如何应用更高级别 'set' 这样才能工作(编辑:我想在 Sprite 中使用 'set' 函数,而不是在 Point 中使用 'set' 函数):

// EDIT: example calling line, embedding context should be unimportant
// 'this' is a Sprite instance
this.position.set(x, y);


Object.defineProperties(Sprite.prototype, {

// a bunch of other properties excised here

    position: {
        get: function() {
            return this._position;
        },

        set: function(_pos) {
            this._position.x = this.transform.x = _pos.x;
            this._position.y = this.transform.y = _pos.y;
            this.transform.updateTransform();
        }
    }
};

目前发生的情况是 "this.position" 进入 "position.get" 属性,然后 "this.position.set" 进入点集函数。似乎尝试 'set' 任何对象 get/set 将下降到最低级别。

感觉一定有办法改变这种行为,但我的 google 和 Whosebug 搜索都没有找到答案。很可能有一个合适的术语来描述我想在这里做的事情,没有它我正在努力正确地回答这个问题。

例如: this 很接近,但在我的情况下不太适用

编辑:我不控制 Point 的源文件,或 this.position.set(x,y); 所在的函数。举行。尽管如果我能证明它不会破坏实际想要使用点集函数的其他对象,我可能可以获得更改调用语法的许可。

你不懂Object.defineProperties。不要难过,在我进一步研究之前我也没有。您将对象的单个 属性 的 set 方法与名为 set 的 属性 混淆了,后者实际上可能有自己的 set 方法。如果您愿意,可以在 属性 的 value 中创建方法。我猜这就是您需要看到的内容:

Object.defineProperties(Sprite.prototype, {
  set: {
    // can also have get and set here
    value: function(){
      // inside Sprite.prototype.set
    }
  },
  position: {
    get: function() {
      return this._position;
    },
    set: function(_pos) {
      this._position.x = this.transform.x = _pos.x;
      this._position.y = this.transform.y = _pos.y;
      this.transform.updateTransform();
    }
  }
});

我觉得很酷。这种东西一定是在幕后使用的所以length属性真的是方法。

既然 Bergi 没有 post 回答,我会的,因为这是一个很好的问题。

如果您不控制任何周围的代码,那么不幸的是,只有丑陋的方法可以做到这一点。

A) Return 一个代理对象,它将按照 Bergi 的建议做任何你想做的事。

缺点是周围的代码可能期望它发送的对象与接收到的对象相匹配。开发人员会比较对象引用而不是值,然后这样的比较就会失败,这并不是不可想象的。但这已经在你的代码中发生了,所以如果你已经在使用它并且没有任何问题,你就可以开始了。

此外,如果你这样做,你应该制作 MyPoint.prototype = new Point() 或其他东西,这样如果将新方法添加到 Point,它们也将在你的 class 中可用。

B) 手动覆盖 this._position.set and/or setter 和 getters 为构造函数中的每个对象或您设置它的任何地方。这很慢而且非常脏,这个想法太糟糕了,我写了一个片段然后删除了它:)

这里有一些关于您实际应该做什么的选项。

A) 同意Sprite的用户使用sprite.position = newPossprite.setPosition(newPos)。那么你应该 return _positionObject.freeze()d 副本在 getter 中,以确保它没有被不当使用。

B) 同意 Point 的作者在它发生变化时发出一些事件,然后可以被 Sprite

监听