JavaScriptについてです。

Function.prototype.applyメソッドをJavaScriptで実装してください。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2015/05/06 23:25:03

回答2件)

id:language_and_engineering No.1

回答回数170ベストアンサー獲得回数63

やってみました・・・。


JavaScriptのFunction.prototype.applyを,やさしいピュアJavaScriptだけで実装してみよう (call/applyの仕組みを理解するためのオレオレ実装)
http://d.hatena.ne.jp/language_and_engineering/20150430/p1

id:a-kuma3

おっと被った X-|

やっぱり、eval 使うしかないですよね。

2015/04/30 14:20:56
id:language_and_engineering

そうですよね。いやあよかった,evalに手を出してしまったことで,ひどく良心が痛み,冷や汗をかいていたのですが,他の回答者さんもevalを使っていたので,心に責めを負わずに済みました

2015/04/30 14:40:42
id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154

こんな感じでしょうか。

Function.prototype.apply = function() {
    var f = this;
    var o = arguments[0];
    var a = arguments[1];
    var s = "var ret = f.call(o,";
    for (var i = 0 ; i < a.length ; ++i) {
        s += "a[" + i + "]";
        if (i != a.length - 1) {
            s += ", ";
        }
    }
    s += ");"
    eval(s);
    return ret;
}

Function#call メソッドを使ってます。
Function.prototype.call を実装しなさい、だったら、もうちょっとスッキリと書けそうですが。

  • id:b-stat
    ありがとうございます。
    お二方が書かれた通り、やはり eval を使うことになるのでしょうか。

    lang_and_engine 様が書かれたソースだと対象のオブジェクトを汚染してしまうのが気になりました。
    メソッドの存在確認をして、呼び出した後に delete で消す処理があれば完璧だと思います。

    a-kuma3 様が書かれたソースでは、apply とほぼ同等の call メソッドを使われているので引数の処理だけに注目したということだと理解しました。
    質問の文面では実装方法の規定をしていませんので対象のオブジェクトに影響を与えない実装としては当然なのかもしれないと思いました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません