【问题标题】:Dynamic Parameters for metaprogramming in JavaScript?JavaScript中元编程的动态参数?
【发布时间】:2012-12-02 05:20:18
【问题描述】:

我想将几个方法从一个 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 参数呢?是否可以将代码更改为具有任意数量的参数?这是在任何浏览器中运行的吗?

问候,雷纳

【问题讨论】:

  • 我不会称之为元编程。这是简单的函数式编程。

标签: javascript dynamic parameters delegates metaprogramming


【解决方案1】:

试试这个:

function delegate_to(_method, _obj) {
  return function() {
    return _obj[_method].apply(_obj, [].slice.call(arguments))
  }
}

【讨论】:

  • 参数不是数组,不能合法调用切片。
  • @raghavv 是的,你是对的,我忘记了,已经进行了编辑。
  • 更好的方法是 Array.prototype.slice.call(arguments, 0) 因为你不必要地构造空数组。
  • 是的,它确实对我有用,谢谢!使用Array.prototype.slice.call(arguments, 0) 与其他回复有什么区别?
  • 好的,我刚刚得到答案。谢谢!
【解决方案2】:

函数具有称为“应用”的方法,可以将可变数量的参数作为数组传递。参考MDC:Function.apply

您可以通过
Array.prototype.slice.call(arguments, 0)将传递给函数的所有参数转换为数组

使用这两个主体,我修改了您的代码以采用多个参数。见 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]); };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多