2012-10-09 70 views
2

我想從子類Camera中的overriden setter調用超類SceneNode中的setter「transform」。如何從子類中調用超類中的getter/setter?

的類是這樣的:

場景節點:

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和getters,我試圖擺脫setXXX函數。

回答

3

Getters和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; 
    } 
}); 
+0

工程就像一個魅力。謝謝! – Markus