PHP等效的PHP __invoke

时间:2013-09-26 03:39:30

标签: javascript php class

我正在开发一个小框架(在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");

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

  return pubif;
}

其余代码保持不变。