2016-08-14 10 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.getRandomKeyRandomizer.getRandomElementを変更して、にbパラメータを定義しないようにするにはどうすればよいですかは本来loremオブジェクトそのもので、getRandomElementが呼び出されますか? argumentsオブジェクトで何かを行うことができますか?applyを呼び出して、最初の要素を取り除き、その後に引数を渡しますか?

+3

は今まで関数内のプロトタイプに割り当てないでください。それを最大で一回行います。ネイティブプロトタイプの場合は、まったくやってはいけません。 – Bergi

+0

@Bergi、この関数はせいぜい一度呼び出すことを意図していました。そして、私は明示的に任意のオブジェクト、配列または関数のこれらのランダム化機能を有効にしたいと思います。 –

+0

そして、それを一度だけ呼び出すと、関数に入れないでください。コードを構造化するために行う場合は、コードをモジュールまたはIEFEに入れます。 – Bergi

答えて

1

は私がまさにその最初の要素を取り除くと、その後に引数を渡すapplyを呼び出す前にargumentsオブジェクトで何かを行うことができますか?

はい、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); 
    // ... 
}; 
関連する問題