首先,我不完全理解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,所以重写对象不是一个选项,只需添加它们和它们的原型。
答案 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