4

ある JavaScript オブジェクトから別の JavaScript オブジェクトにいくつかのメソッドを委任したいと考えています。そこで、メタプログラミングを使用して、いくつかのメソッドをデリゲートとして定義しないようにすることを考えました。これまでのところ、私はこの方法で終わりました:

function delegate_to(_method, _obj) {
  return function(_args) { // One parameter, what's about multiple parameters?
    return _obj[_method](_args)
  }
}

したがって、サンプルコードとして、それがどのように機能するか:

var that = {}
var delegate = {}
that.foo = function(_message) { console.log("foo: " + _message) }
that.bar = function(_message) { console.log("bar: " + _message) }
that.baz = function(_message) { console.log("baz: " + _message) }

function delegate_to(_method, _obj) {
  return function(_args) { // One parameter, what's about multiple parameters?
    return _obj[_method](_args)
  }
}

['foo', 'bar', 'baz'].forEach(function(method) {
  delegate[method] = delegate_to(method, that)
})

delegate.foo('Hello JS') // foo: Hello JS
delegate.bar('Hello JS') // bar: Hello JS
delegate.baz('Hello JS') // baz: Hello JS

コードは機能しますが、複数のパラメーターを持つメソッドを委任したい場合はどうすればよいですか? nパラメータはどうですか?任意の数のパラメーターを持つようにコードを変更することは可能ですか? これはどのブラウザーでも実行されますか?

よろしく、ライナー

4

2 に答える 2

2

これを試して:

function delegate_to(_method, _obj) {
  return function() {
    return _obj[_method].apply(_obj, [].slice.call(arguments))
  }
}
于 2012-12-14T08:04:41.927 に答える
1

関数には、可変数のパラメーターを配列として渡すための「apply」というメソッドがあります。MDC:Function.applyを参照

関数に渡されたすべてのパラメーターを配列に変換するには、次のようにします。
Array.prototype.slice.call(arguments, 0)

これら 2 つのプリンシパルを使用して、複数のパラメーターを取得するようにコードを変更しました。JSBin http://jsbin.com/iwiwix/3/watchを参照してください。

関連するコードの抜粋:

delegate.foo('Hello JS', "from foo"); // foo: Hello JS



function delegate_to(_method, _obj) {
  return function() {
    var argArray =  Array.prototype.slice.call(arguments, 0);
    return _obj[_method].apply(_obj, argArray);
  };
}



that.foo = function() { console.log("foo: " + arguments[0] + ' ' + arguments[1]); };
于 2012-12-14T08:17:46.703 に答える