Я пытаюсь провести 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+. Спасибо!