我想从子类Camera中的overriden setter中调用超类SceneNode中的setter“transform”。
这些课程如下:
场景结点:
function SceneNode(){
this._transform = M4x4.I;
}
SceneNode.prototype.__defineSetter__("transform",
function(transform){
this._transform = transform;
}
);
SceneNode.prototype.__defineGetter__("transform",
function(){
return this._transform;
}
);
相机:
function Camera(){
}
Camera.prototype = new SceneNode();
Camera.base = SceneNode.prototype;
Camera.prototype.__defineSetter__("transform",
function(transform){
Camera.base.transform.call(this, transform);
this.updateViewMatrix();
}
);
Camera.prototype.__defineGetter__("transform",
function(){
return this._transform;
}
);
这不起作用,因为“Camera.base.transform”没有根据firefox定义。我以前称之为“Camera.base.setTransform.call(this,transform);”之前,哪个有效,但自从我了解了setter和getter之后,我试图摆脱setXXX函数。
答案 0 :(得分:3)
getter和setter隐藏了底层函数,因此您需要一种绕过属性并直接获取setter的方法。 (它是未定义的,因为它实际上是访问SceneNode.prototype
的getter的返回值,它没有实例来获取值。)__defineSetter__
的对应部分是__lookupSetter__
:
Camera.prototype.__defineSetter__("transform",
function(transform){
Camera.base.__lookupSetter__("transform").call(this, transform);
this.updateViewMatrix();
}
);
但这些方法已被弃用,因此正确的(ECMAScript 5)方法是使用Object.defineProperty
和Object.getOwnPropertyDescriptor
:
Object.defineProperty(Camera.prototype, 'transform', {
set: function(transform){
Object.getOwnPropertyDescriptor(Camera.base, 'transform').set.call(this,
transform);
this.updateViewMatrix();
},
get: function(){
return this._transform;
}
});