Перезаписать прототип Javascript функциями-заглушками

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


person Daniel    schedule 07.12.2013    source источник
comment
Я не обязательно думаю, что это опасно, но я уверен, что есть лучший способ. Зачем нужны заглушки? Будут ли вызываться функции, даже если пользователь не входит в группу управления? Если они не в группе, я бы вообще не стал инициализировать объект, если в этом нет необходимости.   -  person jm0    schedule 07.12.2013
comment
Независимо от того, находится ли пользователь в контрольной группе, функции вызываются. Вот почему мне нужно, чтобы они превратились в заглушки, которые ничего не делают, если пользователь находится в контрольной группе.   -  person Daniel    schedule 07.12.2013


Ответы (1)


Я думаю, что это приемлемо, может быть, лучше заглушить только прямые свойства, определенные hasOwnProperty, если класс не имеет наследования.

person hulufei    schedule 07.12.2013
comment
Да, мой коллега упомянул эту функцию, но я изначально думал, что мне нужно создать экземпляр моего объекта, чтобы использовать его. По-видимому, это работает, если вы делаете NewFeature1.prototype.hasOwnProperty('toString'), что приравнивается к false. Object.prototype.hasOwnProperty('toString') равно true. На следующей неделе проведу дополнительные испытания. Спасибо. - person Daniel; 07.12.2013