2

我正在开发一个小型框架(在 JS 中),出于美学原因和简单性,我想知道是否有办法实现 PHP“__invoke”之类的东西。

例如:

var myClass = function(config) {
    this.config = config;
    this.method = function(){};
    this.execute = function() {
        return this.method.apply(this, arguments);
    }
}
var execCustom = new myClass({ wait: 100 });
execCustom.method = function() {
    console.log("called method with "+arguments.length+" argument(s):");
    for(var a in arguments) console.log(arguments[a]);
    return true;
};
execCustom.execute("someval","other");  

期望的执行方式:

execCustom("someval","other");

有任何想法吗?谢谢。

4

2 回答 2

1

如果你准备好使用 JS 模式,你可以通过以下方式进行:

var myClass = function(opts) {
          return function(){
            this.config = opts.config;
            this.method = opts.method;
            return this.method.apply(this, arguments);
          };
        };


var execCustom = new myClass({
        config:{ wait: 100 }, 
        method:function() {
            console.log("called method with "+arguments.length+" argument(s):");
            for(var a in arguments) console.log(arguments[a]);
            return true;
        }});

execCustom("someval","other");

jsbin

这是我能想到的最好方法

更新版本(按操作)

var myClass = function(opts) {
      var x = function(){
          return x.method.apply(x, arguments);
      };
      x.config = opts.config;
      x.method = opts.method;
      return x; 
    };


var execCustom = new myClass({
    config:{ wait: 100 }, 
    method:function() {
        console.log("called method with "+arguments.length+" argument(s):");
        for(var a in arguments) console.log(arguments[a]);
        return true;
    }});

execCustom("someval","other");

jsbin

于 2013-09-26T04:24:25.410 回答
0

只需返回一个将形成公共接口的函数:

function myClass(config)
{
  var pubif = function() {
    return pubif.method.apply(pubif, arguments);
  };
  pubif.config = config;
  pubif.method = function() { };

  return pubif;
}

其余代码保持不变。

于 2013-09-26T05:48:41.163 回答