用存根函数覆盖Javascript原型

时间:2013-12-07 02:24:04

标签: javascript methods prototype stubs

我正在尝试为我正在添加到网站的新功能运行A / B测试。在过去,我们的团队在显示页面上的各种功能之前已做过类似的事情:

someUserActionThatEnablesFeature:function(){
    experiments.isUserInControlGroup('new-feature1') && newFeature1Obj.show();
}

someUserActionThatDisablesFeature:function(){
    experiments.isUserInControlGroup('new-feature1') && newFeature1Obj.hide();
}

我发现这是非常好的,因为我们必须检查是否在我们使用新功能的每个地方都启用了实验。我正在考虑做的事情是这样的:

function NewFeature1(){
    //constructor
}

NewFeature1.prototype = {
    show:function(){
        //do something
    },
    hide:function(){
        //do something
    },
    //etc
};

//before any objects are declared
if (experiments.isUserInControlGroup('new-feature1')) {
    for(var prop in NewFeature1.prototype) {
        //replace with empty function
        NewFeature1.prototype[prop] = function(){};
    }
}

这里的想法是我在实例化之前用空存根替换NewFeature1类的方法,从而确保如果用户不在控件组中,我对该对象的任何调用都不会执行任何操作。

在某些浏览器中这是危险的吗?我在初始测试中无法判断是否覆盖了Object的属性。在webkit中,它似乎并没有伤害任何东西。我错过了什么吗?我只需要担心webkit,FF和IE8 +。 谢谢!

1 个答案:

答案 0 :(得分:1)

我认为如果该类没有继承,那么仅存在由hasOwnProperty确定的直接属性可能更好。