【发布时间】:2010-11-06 20:21:10
【问题描述】:
在 Rhino 中,我可以通过在 Java 类上定义 js... 函数来添加特定属性。我想要的是定义一个包罗万象的函数,如果程序要引用一个尚未以其他方式定义的属性,则该函数会被调用。有什么办法吗?
【问题讨论】:
标签: rhino
在 Rhino 中,我可以通过在 Java 类上定义 js... 函数来添加特定属性。我想要的是定义一个包罗万象的函数,如果程序要引用一个尚未以其他方式定义的属性,则该函数会被调用。有什么办法吗?
【问题讨论】:
标签: rhino
我认为没有办法使用原生语法来表达这个概念,即使使用 Rhino/Spidermonkey 专有扩展,如 getter 和 setter: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
【讨论】: