javascript设置原型的属性到对象的属性

时间:2013-05-02 16:57:28

标签: javascript reference attributes three.js prototype

首先,我不完全理解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();

...如何向x添加属性obj,以便调用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,所以重写对象不是一个选项,只需添加它们和它们的原型。

1 个答案:

答案 0 :(得分:1)

要让cube.x返回cube.position.x包含的内容,您需要为obj.prototype.x定义访问者和变更器。 Access和mutators是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