Javascript 如何实现通用集随机化器?

Javascript 如何实现通用集随机化器?,javascript,Javascript,假设我打算实现随机化功能,如下所示: 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 ra

假设我打算实现随机化功能,如下所示:

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
,以避免在
lorem
调用中定义
b
参数,该参数本质上是
lorem
对象本身?在调用
apply
之前,我是否可以对
arguments
对象执行一些操作,以除去它的第一个元素,然后传递参数

在调用
apply
之前,我是否可以对
arguments
对象执行一些操作,以除去它的第一个元素,然后传递参数

是的,那是:

var slice = Array.prototype.slice;
….apply(this, slice.call(arguments, 1))
在调用
apply
之前,我是否可以对
arguments
对象执行一些操作,以除去它的第一个元素,然后传递参数

是的,那是:

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

Array.prototype.slice
的替代方法是使用ES6 rest参数:

Function.prototype.getRandomKey = function(ignoreFirstArg, ...args) {
  var result = this.apply(this, args);
  // ...
};

Array.prototype.slice
的替代方法是使用ES6 rest参数:

Function.prototype.getRandomKey = function(ignoreFirstArg, ...args) {
  var result = this.apply(this, args);
  // ...
};

不要在函数中指定原型。最多做一次。对于本机原型,最好不要这样做。是的,您可以对
参数
(例如
slice.call(arguments,1)
)执行一些操作,但为什么它会如此复杂呢?为什么用户要调用
getRandomElement(lorem,“abcde”)
,而不是简单地调用
getRandomElement(lorem(“abcde”)
?保持你的API简单,不要超载。好吧,这看起来是一个非常令人困惑的设计。这里的最终目标是什么?能够从任何对象上获得任何随机属性?我不认为你真的需要修改所有的原型来实现这一点。整个重新定义函数签名以适应他们甚至不应该知道的功能是一个非常好的提示,这是一个糟糕的计划。不要使用
>0
@LajosArpad:我明白了,但这仍然是一个非常混乱的API。如果用户希望调用两个单独的方法,那么查找函数的不动点与获取随机元素无关。永远不要在函数中指定原型。最多做一次。对于本机原型,最好不要这样做。是的,您可以对
参数
(例如
slice.call(arguments,1)
)执行一些操作,但为什么它会如此复杂呢?为什么用户要调用
getRandomElement(lorem,“abcde”)
,而不是简单地调用
getRandomElement(lorem(“abcde”)
?保持你的API简单,不要超载。好吧,这看起来是一个非常令人困惑的设计。这里的最终目标是什么?能够从任何对象上获得任何随机属性?我不认为你真的需要修改所有的原型来实现这一点。整个重新定义函数签名以适应他们甚至不应该知道的功能是一个非常好的提示,这是一个糟糕的计划。不要使用
>0
@LajosArpad:我明白了,但这仍然是一个非常混乱的API。如果用户希望调用两个不同的方法,那么查找函数的不动点与获取随机元素无关。