0

首先,我并不完全理解 Javascript 的原型结构,所以这可能是不可能的。

如果我有 ...

var vector = function( x, y ) {
    this.x = x || 0;
    this.y = y || 0;
}

var obj = function() {
    this.position = new vector( 0, 0, 0 );
}

var cube = new obj();

...我怎样才能添加一个属性xobj使得调用cube.x等效于cube.position.x. 我认为应该可以使每个引用的属性具有相同的值,但我只是不确定语法。类似的东西obj.prototype.x = obj.position.x不起作用,因为obj.position未定义。

我希望以下行为成为可能

alert(cube.position.x); // 0
alert(cube.x); // 0

cube.position.x = 2;
alert(cube.position.x); // 2
alert(cube.x); // 2

cube.x = 4;
alert(cube.position.x); // 4
alert(cube.x); // 4

这可能吗?

我可能应该提到我正在使用 Three.js,所以重写对象不是一种选择,只需添加它们和它们的原型。

4

1 回答 1

1

cube.x返回包含的任何cube.position.x内容,您需要为obj.prototype.x. 访问器和修改器是 JavaScript 中相对较新的功能,大多数版本的 IE 都不支持。

var vector = function( x, y ) {
    this.x = x || 0;
    this.y = y || 0;
}

var obj = function() {
    this.position = new vector( 0, 0, 0 );
}
obj.prototype = {
    ...your prorotype methods here...
};
Object.defineProperty(obj.prototype, 'x', {
    get: function () {
        return this.position.x;
    },
    set: function (val) {
        this.position.x = val;
    }
});

//alternatively:
obj.prototype = {
    get x() {
        return this.position.x;
    },
    set x(val) {
        this.position.x = val;
    }
};

var cube = new obj();
cube.x; //0
cube.x = 10;
cube.position.x; //10
于 2013-05-02T17:09:27.987 回答