2

我想从子类 Camera 中的覆盖设置器中调用超类 SceneNode 中的设置器“转换”。

这些类看起来像这样:

场景节点:

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 函数。

4

1 回答 1

4

getter 和 setter 隐藏了底层的功能,所以需要一种绕过属性直接获取 setter 的方法。(它是未定义的,因为它实际上正在访问 'getter 的返回值SceneNode.prototype,它没有从中获取值的实例。)对应的__defineSetter____lookupSetter__

Camera.prototype.__defineSetter__("transform",
    function(transform){
        Camera.base.__lookupSetter__("transform").call(this, transform);
        this.updateViewMatrix();
    }
);

但是这些方法已被弃用,因此正确的(ECMAScript 5)方法是使用Object.definePropertyand 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;
    }
});
于 2012-11-25T22:44:28.493 回答