2

サブクラス Camera のオーバーライドされたセッターから、スーパークラス SceneNode のセッター「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);」を呼び出していました。以前はうまくいきましたが、セッターとゲッターについて学んだので、setXXX 関数を取り除こうとしました。

4

1 に答える 1

4

ゲッターとセッターは基になる関数を隠すため、プロパティをバイパスしてセッターを直接取得する方法が必要です。SceneNode.prototype(値を取得するインスタンスがない の getter の戻り値に実際にアクセスしているため、未定義です。) に対応するもの__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 に答える