当 属性 类型有自己的 '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 = newPos
或sprite.setPosition(newPos)
。那么你应该 return _position
的 Object.freeze()
d 副本在 getter 中,以确保它没有被不当使用。
B) 同意 Point
的作者在它发生变化时发出一些事件,然后可以被 Sprite
监听
如果“_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 = newPos
或sprite.setPosition(newPos)
。那么你应该 return _position
的 Object.freeze()
d 副本在 getter 中,以确保它没有被不当使用。
B) 同意 Point
的作者在它发生变化时发出一些事件,然后可以被 Sprite