如何从子类中调用超类中的getter / setter?

时间:2012-10-09 18:02:46

标签: javascript

我想从子类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函数。

1 个答案:

答案 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.definePropertyObject.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;
    }
});