我想从子类 Camera 中的重写 setter 中调用父类(super class) 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 函数。
最佳答案
getter 和 setter 隐藏了底层函数,因此您需要一种方法来绕过属性并直接获取 setter。 (它是未定义的,因为它实际上访问的是 SceneNode.prototype
的 getter 的返回值,而该 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;
}
});
关于javascript - 如何从子类调用父类(super class)中的 getter/setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12805777/