Javascript:需要协助制作出厂功能

时间:2011-11-14 04:32:28

标签: javascript this

我需要这样的东西

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

1 个答案:

答案 0 :(得分:1)

你已经在评论中得到了答案,所以这只是一个FYI:

您正在使用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是关键字”问题的常用方法。