有没有一种方法可以重载以处理JavaScript中的未定义属性?

Ale*_*zzi 10 javascript

我正在寻找一种方法来处理JavaScript中未定义的方法和属性的调用.

这些类似于PHP魔术方法__call,__ callStatic,__ get.

使用此代码的示例可能是:

var myObject = {};
myObject.__call = function (called, args) {
    alert(called);
    alert(args);
    return(true);
}

myObject.meow("kitty", "miau");
Run Code Online (Sandbox Code Playgroud)

这将导致第一个警告对话框显示"喵",第二个显示"kitty,miau".

B T*_*B T 5

Proxy可以做到!代理可以做一切!这里给出一个答案:是否有一个javascript相当于python的__getattr__方法?.用我自己的话来改写:

var myObject = new Proxy({},{get(target,name) {
  return function() {
    alert(name)
    console.log(arguments) // alerts are bleh
    return true
  }
}})

myObject.meow("kitty", "miau") // alerts "meow", logs ["kitty","miau"] to the console, and returns true
Run Code Online (Sandbox Code Playgroud)

查看MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

适用于chrome,firefox和node.js. 缺点:在IE中不起作用 - freakin IE.不久.


Ale*_*ley -1

Javascript 中有一个神奇的函数,叫做 __noSuchMethod__。这是一个例子:

var foo = { __noSuchMethod__ : function(name,params) { alert('invalid function call'); } }
foo.bar();
Run Code Online (Sandbox Code Playgroud)

编辑:正如@jldupont提到的,这实际上只在Rhino和SpiderMonkey(Mozilla的JS引擎)中;ECMAScript 标准不支持它。有一些要求将其纳入 ECMAScript 4 中。