我想在Javascript对象上定义一个行为,当引用的属性/方法不存在时,它会启动。
在Lua中,您可以使用元表和__index & __newindex
方法来完成此操作。
--Lua code
o = setmetatable({},{__index=function(self,key)
print("tried to undefined key",key)
return nil
end
})
所以我想知道javascript中是否有类似内容。
我想要实现的是一个通用的RPC接口,它的工作原理如下(不是有效的Javascript):
function RPC(url)
{
this.url = url;
}
RPC.prototype.__index=function(methodname) //imagine that prototype.__index exists
{
AJAX.get(this.url+"?call="+ methodname);
}
var proxy = RPC("http://example.com/rpcinterface");
proxy.ServerMethodA(1,2,3);
proxy.ServerMethodB("abc");
那我怎么能这样做呢?
甚至可以这样做吗?
答案 0 :(得分:4)
仅供参考:Firefox支持非标准__noSuchMethod__
扩展名。
答案 1 :(得分:3)
javascript更像是scheme,而不是像smalltalk(支持未定义的方法)或lua。很遗憾,据我所知,您的请求不受支持。
您可以通过额外的步骤来模拟此行为。
function CAD(object, methodName) // Check and Attach Default
{
if (!(object[methodName] && typeof object[methodName] == "function") &&
(object["__index"] && typeof object["__index"] == "function")) {
object[methodName] = function() { return object.__index(methodName); };
}
}
所以你的例子变成了
function RPC(url)
{
this.url = url;
}
RPC.prototype.__index=function(methodname) //imagine that prototype.__index exists
{
AJAX.get(this.url+"?call="+ methodname);
}
var proxy = RPC("http://example.com/rpcinterface");
CAD(proxy, "ServerMethodA");
proxy.ServerMethodA(1,2,3);
CAD(proxy, "ServerMethodB");
proxy.ServerMethodB("abc");
可以在CAD中实现更多功能,但是这给了你一个想法......你甚至可以将它用作调用函数的调用机制,如果它存在的话,绕过我引入的额外步骤。
答案 2 :(得分:1)
我认为您的实际需求比示例更复杂,因为您对传递给ServerMethodA
和ServerMethodB
的参数一无所知,否则您只会执行类似< / p>
function RPC(url)
{
this.url = url;
}
RPC.prototype.callServerMethod = function(methodname, params)
{
AJAX.get(this.url+"?call="+ methodname);
}
var proxy = RPC("http://example.com/rpcinterface");
proxy.callServerMethod("ServerMethodA", [1,2,3]);
proxy.callServerMethod("ServerMethodB", "abc");
答案 3 :(得分:1)
问了8年零8个月前
现在我们可以使用“代理”
一种简单的使用方法:
-Lua代码
local o = setmetatable({},{__index=function(self,key)
print("tried to undefined key",key)
return nil
end
//在Java中具有代理服务器
let o = new Proxy({}, {
get: function (target, key, receiver) {
if (!target.hasOwnProperty(key)){
console.log("tried to undefined key "+key);
}
return Reflect.get(target, key, receiver);
},
set: function (target, key, value, receiver) {
console.log(`set `+ key);
return Reflect.set(target, key, value, receiver);
}
})
获取:__index
set:__newindex
Reflect.get:rawget
Reflect.set:rawset
在控制台中:
let o= new Proxy({},{
get: function (target, key, receiver) {
let ret = Reflect.get(target, key, receiver);
if (!target.hasOwnProperty(key)){
console.log("tried to undefined key "+key);
}
return ret;
}
})
>> undefined
o.a
>> VM383:5 tried to undefined key a
>> undefined
o.a = 1
>> 1
o.a
>> 1