如何使用'设置'当属性类型具有' set'它自己的?

时间:2015-11-03 01:55:27

标签: javascript getter-setter defineproperty

如果' _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函数的其他对象。

2 个答案:

答案 0 :(得分:1)

由于Bergi没有发表答案,我会,因为这是一个很好的问题。

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

A)像Bergi建议的那样,返回一个代理对象,它会做你想做的任何事情。

缺点是周围的代码可能期望它发送的对象与收到的对象相匹配。开发人员比较对象引用而不是值,这并不是不可思议的,然后这样的比较就会失败。但是这已经在您的代码中发生了,所以如果您已经使用它并且没有任何损失,那么您将很高兴。

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

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

以下是您应该做什么的一些选项。

A)同意Sprite的用户使用sprite.position = newPossprite.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(); } } }); 属性才是真正的方法。