2013-09-26 2 views
1

Я разрабатываю небольшую структуру (в JS) и по эстетическим соображениям и простоте мне было интересно, может ли быть способ реализовать что-то вроде PHP «__invoke».JavaScript, эквивалентный 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"); 

Есть идеи? Благодарю.

+0

jsbin: http://jsbin.com/ESOLIce/1/edit?js,console – lepe

+0

Насколько я знаю, поскольку execCustom является экземпляром функции myClass, поэтому вы либо используете основную функцию как конструктор для класса или как метод для выполнения. Единственное, о чем я могу думать, это определить функцию-оболочку, например функцию exec (execCustom) {execCustom .__ invoke()}, где __invoke определяется как функция в execCustom (myClass). –

+0

Спасибо Зак. Да, я так и думал ... Если я не найду более красивый способ сделать это, то, я думаю, я оставлю это так. – lepe

ответ

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

это лучший способ, которым я могу думать о

обновлённая версия (by op)

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

+0

Очень креативный! Я думаю, что больше невозможно получить доступ к значениям «config» и «method»? – lepe

+0

Я обновил ваш код, чтобы получить доступ к следующим объектам: http://jsbin.com/ESOLIce/13/watch?js,console У вас возникли проблемы с этим кодом? – lepe

+0

да, ваш лучше. – caoglish

0

Просто возвращает функцию, которая будет формировать открытый интерфейс:

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

    return pubif; 
} 

Остальная часть кода остается тем же самым.

Смежные вопросы