在一些javascript实现中有一个noSuchMethod功能(Rhino,SpiderMonkey)
proxy = {
__noSuchMethod__: function(methodName, args){
return "The " + methodName + " method isn't implemented yet. HINT: I accept cash and beer bribes" ;
},
realMethod: function(){
return "implemented" ;
}
}
js> proxy.realMethod()
implemented
js> proxy.newIPod()
The newIPod method isn't implemented yet. HINT: I accept cash and beer bribes
js>
Run Code Online (Sandbox Code Playgroud)
我想知道,有没有办法为房产做类似的事情?我想编写可以在属性和方法上分派的代理类.
IE11不会也不会实现ES2015代理对象.然而,IE11的延长支持终止于2025年10月14日.
有没有办法为IE11填充代理对象?所有其他浏览器都支持Proxy.
如果是,那么我们今天都可以在生产中使用它.如果没有,那么我们将不得不等待近十年......
编辑:我专门针对IE11,因为我知道IE通常具有我通常不知道的IE特定功能.
Edit2:我特别感兴趣的是能够实现一个全能拦截器.与__getattr__Python 类似.它只需要在IE11中工作.
javascript internet-explorer ecmascript-6 internet-explorer-11 es6-proxy
在PHP中,您可以使用"魔术" __call功能检测方法何时被调用,即使它不存在.
public function __call($methodName, $args)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
您可以调用任何方法,并将名称和参数传递给此魔法catch-all.
在JavaScript中是否有类似的技术允许调用任何方法,即使它实际上不存在于对象上?
var foo = (function () {
return {
__call: function (name, args) { // NOT REAL CODE
alert(name); // "nonExistent"
}
}
}());
foo.nonExistent();
Run Code Online (Sandbox Code Playgroud) 如何在JavaScript中模拟PHP风格的__get()和__set()魔术getter/setter?很多人都说现在这是不可能的.我几乎可以肯定这是可能的,因为像nowjs(http://nowjs.com)这样的项目会做这样的事情.
我知道您可以使用get和set,但是当您不确定属性名称是什么时,这些不起作用.例如,如果您希望在创建新属性时执行事件处理程序,该怎么办?
我想做的例子:
var obj = {};
notify(obj, function(key, value) {
//key is now the name of the property being set.
//value is the value of the property about to be set
console.log("setting " + key + " to " + value);
});
obj.foo = 2; //prints "setting foo to 2"
obj.bar = {a: 2}; //prints "setting bar to [Object]"
//Notice that notify() worked even though 'foo' and 'bar' weren't even defined …Run Code Online (Sandbox Code Playgroud) 有没有办法__getattr__在Javascript中模拟Python的方法?
我想拦截Javascript对象属性的'获取'和'集'.
在Python中,我可以编写以下内容:
class A:
def __getattr__(self, key):
return key
a = A()
print( a.b ) # Output: b
Run Code Online (Sandbox Code Playgroud)
Javascript怎么样?
在python中,您可以定义一个对象,该对象具有__getattr__(self,key)处理所有未知属性的方法,这些方法可以以编程方式解决,但在javascript中,您只能为预定义属性定义getter和setter.是否有一种通用的方式来在javascript中完成前一件事?
示例代码如下:
function X() {};
X.prototype={
__getattr__:function(attrname) {
return "Value for attribute '"+attrname+"'";
}
}
x=new X()
alert(x.lskdjoau); // produces message: "Value of attribute 'lskdjoau'"
Run Code Online (Sandbox Code Playgroud)
关键点是根据属性的名称以编程方式获取属性的值.预设置属性没有帮助,因为在init期间没有信息可能请求哪些属性.
考虑以下javascript示例:
var myobj = { func1: function() { alert(name in this) },
func2: function() { alert(name in this) },
func3: function() { alert(name in this) }
}
myobj.func2(); // returns true
myobj.func4(); // undefined function
Run Code Online (Sandbox Code Playgroud)
myobj如果func4()在保留myobj.functionCall()格式的同时没有定义键/函数(如),是否可以创建一个"全能"键?
可能重复:
所有属性的JavaScript getter
JavaScript是否提供了访问未定义对象属性的方法?在PHP中,解决方案是__get()在类中声明和实现方法.
使用try { .. } catch { .. }的解决方案对我来说还不够,因为我已经拥有非常大量的代码,而这些代码实际上需要保持原样.
JavaScript下的任何魔术(al)方法都是?
我在明确兴趣setter方法,getter方法和可调用(函数/方法),像我们在PHP:__set,__get和__call&& __callStatic.
我在谷歌上搜索和搜索StackOverflow,但没有结果.
如果有人被告知,请,谢谢!
如何为原型指定默认的getter?使用默认getter,我的意思是调用if函数obj.undefinedProperty123.
我尝试了Object.prototype.get = function(property){..},但在这种情况下不会调用它.
javascript ×10
getter ×2
php ×2
catch-all ×1
default ×1
ecmascript-5 ×1
ecmascript-6 ×1
es6-proxy ×1
function ×1
get ×1
key ×1
node.js ×1
properties ×1
prototype ×1
setter ×1
undefined ×1