【问题标题】:does javascript have an equivalent to the php magic class __call [duplicate]javascript 是否具有等效于 php 魔术类 __call [重复]
【发布时间】:2020-12-26 10:27:39
【问题描述】:

我想知道我能做什么:

var o={

   __call : function(methodname,arguments){
      alert(methodname);
   }

};

o.hello();  <-alerts 'hello'

类似php的魔术方法__call

我本质上想要做的是调用将存在但在代码首次运行时未知的函数,我可以通过类似的方式来实现

function fn(){
   var s='mod';
   var o=mod;
   var n=arguments.length;
   for(var i=0;i<n;i++){
      var name=arguments[i];
      s+='.'+name;
      if(!o[name])return ()=>s+' not found';
      o=o[name];
   }
   return o;
}

var mod={
   square:{
      area:r=>r*r
   }
};

var a=fn('square','area')(5);     console.log(a);
var a=fn('circle','area')(6);     console.log(a);

但我更喜欢使用

var a=mod.square.area(5);         console.log(a);
var a=mod.circle.area(6);         console.log(a);

【问题讨论】:

  • 它似乎没有按我的意愿工作,尽管我正在研究它,但 getter 基本上需要知道它们是作为属性还是方法被调用,这是 php 的 __call 方法的一个方面,如果他们知道的话,他们可以返回新的代理或函数来收集参数

标签: javascript object


【解决方案1】:

它粗糙且准备就绪,但这里有一些可行的方法

var mod=newproxy();
    
    
mod.callme.first$('hello','world');         //?  mod.callme.first.fn('hello','world');
    
mod.difcontext.hello='world';               //?  mod.difcontext.hello.prop='world';
    
mod.difcontext.start=['hello','world'];     
    
mod.difcontext.cat_;                        //?  mod.difcontext.cat.prop;
    
   
function newproxy(main){
          
    main=main||{};
    return proxy(main);
          
    function getter(target,name,receiver,lname){
    
        lname+=lname?'.'+name:name;
        var c=name[name.length-1];
        if(c==='$'){
            lname=lname.slice(0,-1);
            return function(){
                console.log('fn : ',lname,arguments);
            };
        }
        if(c==='_'){
            lname=lname.slice(0,-1);
            console.log('rd : ',lname);
            return;
        }
        return proxy(target,lname);
          
    }//getter
          
    function setter(obj,prop,newval,lname){
          
        lname+=lname?'.'+prop:prop;
        console.log('wt : ',lname,newval);
                
          
    }//setter
          
    function proxy(target,lname){
          
      lname=lname||'';
      var p=new Proxy(target,{
        get:(target,name,receiver)=>{return getter(target,name,receiver,lname);},
        set:(obj,prop,newval)=>{return setter(obj,prop,newval,lname);}
      });
                
      return p;
          
    }//proxy
          
}//newproxy
    

使用命名约定

$ 表示一个结束函数,(可以以 .fn 结束)

_ 表示读取变量,(可以以 .prop 结尾)

setter 可以用来调用一个函数,但它不是常规的

暂时我决定去

mod('difcontext.callme.first',['hello','world'],callback);

如果 getter 本质上知道它们是如何被调用的......

var mod=new Proxy({},{
      get:(target,name,receiver)=>{return function(){alert(name)}}
});
          
mod.hello();

我被提到了另一个问题,我在那里发布了一个更完整的解决方案:

Is there an equivalent of the noSuchMethod feature for properties, or a way to implement it in JS?

【讨论】:

  • 我添加了一个更完整的答案link
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多