2009-10-29 90 views
4

我想定義一個Javascript對象的行爲,當被引用的屬性/方法不存在時,這些對象將會啓動。 在Lua中,您可以使用metatables和__index & __newindex方法來做到這一點。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

任何想法的人? – 2009-10-29 10:38:29

回答

3

的javascript更像是計劃而不是像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中實現,但是這給你的想法......你甚至可以用它作爲與參數,如果調用功能的調用機制它存在,繞過我介紹的額外步驟。

+0

我有點想象,JavaScript有一個__index,而我只是找不到它,但似乎我錯了。感謝您的信息和竅門。這對我的目標來說已經足夠了! – 2009-10-29 15:58:54

1

我假設你的實際需要比這個例子更復雜,因爲你正在做什麼與你傳遞給ServerMethodAServerMethodB參數,否則你只會做這樣的事情

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"); 
4

僅供參考:Firefox支持非標準__noSuchMethod__擴展。

+0

感謝您的信息,不幸的是我需要跨瀏覽器兼容性,但很高興知道,也許其他人將遵循套件 – 2009-10-30 13:50:29

相關問題