如果' _position'是Sprite的Point对象成员,其中包含Number成员x和y,以及它自己的get / set定义,如何应用更高级别的set&set 39。这样就可以了(编辑:我想在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"进入Point设置功能。似乎试图设置'任何带有它的对象自己的get / set都会下降到最低级别。
感觉必须有办法改变这种行为,但我的google和stackoverflow搜索没有得到答案。我可能会在这里做一个合适的术语,如果没有这个术语,我就可以正确地解决这个问题。
例如: this已接近,但在我的情况下并不适用
编辑:我没有控制Point的源文件,或者this.position.set(x,y)的函数;举行。虽然我可以获得更改调用语法的权限,但如果我能证明它不会破坏实际上想要使用Point set函数的其他对象。
答案 0 :(得分:1)
由于Bergi没有发表答案,我会,因为这是一个很好的问题。
如果你不控制任何周围的代码那么,不幸的是,只有丑陋的方法来做到这一点。
A)像Bergi建议的那样,返回一个代理对象,它会做你想做的任何事情。
缺点是周围的代码可能期望它发送的对象与收到的对象相匹配。开发人员比较对象引用而不是值,这并不是不可思议的,然后这样的比较就会失败。但是这已经在您的代码中发生了,所以如果您已经使用它并且没有任何损失,那么您将很高兴。
此外,如果你这样做,你应该制作MyPoint.prototype = new Point()
或其他东西,以便如果将新方法添加到Point,它们也可以在你的班级中使用。
B)为构造函数中的每个对象或您设置的任何对象手动覆盖this._position.set
和/或setter和getter。这很慢而且非常脏,这是一个非常糟糕的想法,我写了一个片段,然后将其删除:)
以下是您应该做什么的一些选项。
A)同意Sprite
的用户使用sprite.position = newPos
或sprite.setPosition(newPos)
。然后,您应该在getter中返回Object.freeze()
d _position
d副本,以确保其使用不当。
B)同意Point
的作者在发生变更时发出一些事件,然后由Sprite
答案 1 :(得分:0)
你不明白with open('tester_everything.txt') as f:
mylist = []
i=0
for lines in f:
other_list = []
if lines == '\n':
mylist.append(other_list)
other_list = []
other_list.insert(i, lines)
i = i+1
print mylist
f.close()
。不要感觉不好,直到我进一步研究它,我也没有。您将Object的单个属性的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();
}
}
});
属性才是真正的方法。