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。如果用户希望调用两个不同的方法,那么查找函数的不动点与获取随机元素无关。