2010-11-05 54 views
0

在Rhino中,我可以通過在Java類上定義js ...函數來添加特定的屬性。我想要的是定義一個catchall函數,如果程序去引用一個未定義的屬性,這個函數會被調用。有沒有辦法?用於Javascript的犀牛動態屬性

回答

2

我不認爲這是使用原生的語法來表達這個概念,甚至使用類似的getter和setter犀牛/ SpiderMonkey的專有擴展的方式:https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Defining_Getters_and_Setters

然而,JavaScript是相當容易的擴展,所以我認爲可以通過向Object.prototype添加一個方法來支持這種更高級的樣式方法調用,從而獲得非常接近的結果。下面似乎你想要做什麼:

Object.prototype.invokeMethodOrDefault = function(methodName,argsArray){ 
    if(this[methodName] && typeof this[methodName] == "function"){ 
     //invoke method with given arguments 
     this[methodName].apply(this,argsArray) 
    }else{ 
     this.defaultMethod.apply(this,argsArray) 
    } 
} 

//add a defaultMethod noop that can be overridden for individual subclasses 
Object.prototype.defaultMethod = function(){print("In default method")} 

//test it 
foo = { 
    helloWorld:function(){ 
     print("hello world!") 
     print("args:") 
     for(var i=0,l=arguments.length;i<l;i++){ 
      print(arguments[i]); 
     } 
    } 
} 
foo.invokeMethodOrDefault("thisMethodDoesNotExist",[]) 

foo.invokeMethodOrDefault("helloWorld",["arg1","arg2"]) 


bar = { 
    helloWorld2:function(){ 
     print("hello world2!") 
     print("args:") 
     for(var i=0,l=arguments.length;i<l;i++){ 
      print(arguments[i]); 
     } 
    }, 
    defaultMethod:function(){ 
     print("in new default method") 
    } 
} 

bar.invokeMethodOrDefault("thisMethodDoesNotExist",[]) 

bar.invokeMethodOrDefault("helloWorld2",["arg1","arg2"]) 

打印出以下幾點:

In default method 
hello world! 
args: 
arg1 
arg2 
in new default method 
hello world2! 
args: 
arg1 
arg2 
+0

我期待必須用Java編寫這一點,如果它能夠在全部完成! – bmargulies 2010-11-06 13:51:07

+0

對於酷代碼示例+1。 – 2012-10-27 02:44:06