2016-08-14 5 views
0

Предположим, что я намерен реализовать функциональность рандомизации, например:Как реализовать общий набор рандомизатора?

function Randomizer() { 
    //Get random member name of object 
    Object.prototype.getRandomKey = function() { 
     var keys = Object.keys(this); 
     return keys[Math.floor(Math.random() * keys.length)]; 
    }; 
    //Get random member value of object 
    Object.prototype.getRandomElement = function() { 
     return this[this.getRandomKey()]; 
    }; 
    //Get random index of array 
    Array.prototype.getRandomKey = function() { 
     return Math.floor(Math.random() * this.length); 
    }; 
    //Get random element of array 
    Array.prototype.getRandomElement = function() { 
     return this[this.getRandomKey()]; 
    }; 
    //Get random return key of function result 
    Function.prototype.getRandomKey = function() { 
     var result = this.apply(this, arguments); 
     return result && result.getRandomKey(); 
    }; 
    //Get random return member of function result 
    Function.prototype.getRandomElement = function() { 
     var result = this.apply(this, arguments); 
     return result && result.getRandomElement(result.getRandomKey()); 
    }; 
    //Get random element name of what if supported 
    Randomizer.getRandomKey = function(what) { 
     if ((!what) || (["undefined", "number", "boolean"].indexOf(typeof what) >= 0)) { 
      //unsupported 
     } else if (typeof what !== "function") { 
      return what.getRandomKey(arguments); 
     } else { 
      return Randomizer.getRandomKey(what.apply(this, arguments)); 
     } 
    }; 
    //Get random element value of what if supported 
    Randomizer.getRandomElement = function(what) { 
     if ((!what) || (["undefined", "number", "boolean"].indexOf(typeof what) >= 0)) { 
      //unsupported 
     } else if (typeof what !== "function") { 
      return what.getRandomElement(arguments); 
     } else { 
      return Randomizer.getRandomElement(what.apply(this, arguments)); 
     } 
    }; 
} 

Это, как я инициализировать его

Randomizer(); 

Пример использования

function lorem(b, a) { 
    return a.substring(1); 
} 
Randomizer.getRandomElement(lorem, "abcde"); 

Мой вопрос заключается в следует: Как я могу изменить Randomizer.getRandomKey и Randomizer.getRandomElement, так что я могу избежать определения параметра b в lorem который по существу является объектом lorem по вызову getRandomElement? Могу ли я что-то сделать с объектом arguments, прежде чем звонить apply, чтобы избавиться от его самого первого элемента и передать аргументы после этого?

+3

Никогда не назначать опытные образцы внутри функции. Сделайте это один раз максимум. А для отечественных прототипов лучше всего этого не делать. – Bergi

+0

@Bergi, эта функция должна была называться один раз максимум. И я явно хочу включить эти функции рандомизации для любых объектов, массивов или функций. –

+0

Тогда не помещайте его в функцию, если вы вызываете ее только один раз. Если вы хотите сделать это для структурирования кода, введите код в модуль или IEFE. – Bergi

ответ

1

Могу ли я сделать что-то с arguments объекта перед вызовом apply, чтобы избавиться от своего самого первого элемента и передать аргументы после этого?

Да, slice делает это:

var slice = Array.prototype.slice; 
….apply(this, slice.call(arguments, 1)) 
1

Альтернативы Array.prototype.slice использует ES6 отдых параметры:

Function.prototype.getRandomKey = function(ignoreFirstArg, ...args) { 
    var result = this.apply(this, args); 
    // ... 
}; 
Смежные вопросы