2011-11-14 47 views
2

我需要的東西,像這樣的Javascript:與製作廠上下的功能需要幫助

function updateRender(ClassName){ 
    if(!(this.currentRender instanceof ClassName)){ 
     doPreprocessing(); 
     this.currentRender = new ClassName(); 
     doPostProcessing(); 
    } 
} 

所以我就能夠調用updateRender一個新的渲染對象,它可以是不同類型。

updateRender(SolidRender); 
updateRender(HollowRender); 
updateRender(HollowRender); //does nothing because currentRender is HollowRender 
+2

什麼不工作? – icktoofay

+0

以上是一個有效的JavaScript?我正在寫僞代碼。沒想到我可以做到這一點 – dchhetri

+0

是的,它是有效的JavaScript,雖然'this'似乎有點不合適,我會稱之爲'clazz'而不是'ClassName'。 – icktoofay

回答

1

你已經有了在評論你的答案,所以這只是一個供參考:

您使用this.currentRender,其中 - 如果函數是在全球範圍內 - 將指變量的全球範圍。即到瀏覽器的window對象。把東西放在全球範圍內是很不明智的。

從技術上講,你應該把所有的你的代碼放在一個單一的命名空間中,或者甚至放在一個立即調用的函數中,以免污染全局範圍。但是,你可以簡單地這樣得到currentRender變了全球範圍內的開始:

var updateRender = (function() { 
    var currentRender = null; 

    return function (klass) { 
     doPreprocessing(); 
     currentRender = new klass(); 
     doPostProcessing(); 
    }; 

}()); 

updateRender功能仍然會在全球範圍內,但至少currentRender變量被安全地隱藏在閉包內,所以只有updateRender可以改變它(又名特權訪問)。

至於使用klass而不是Class,這完全取決於你。使用klass只是解決Ruby中「class是關鍵字」問題的常用方法。

+0

感謝頂部。該函數不在全局名稱空間中。它是某個對象的原型函數。 – dchhetri