Dans Rhino, je peux ajouter des propriétés spécifiques en définissant des fonctions js ... sur une classe Java. Ce que j'aimerais, c'est définir une fonction catchall qui est appelée si un programme va référencer une propriété qui n'a pas été définie autrement. Y a-t-il un moyen?rhino propriétés dynamiques pour Javascript
0
A
Répondre
2
Je ne pense pas qu'il y ait un moyen d'exprimer ce concept en utilisant la syntaxe native, même en utilisant des extensions propriétaires Rhino/Spidermonkey comme accesseurs: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Defining_Getters_and_Setters
Cependant, JavaScript est assez facile à étendre, et je pense que vous pourriez obtenir quelque chose de très proche en ajoutant une méthode à Object.prototype pour supporter cette invocation de méthode de style plus avancée. Ce qui suit semble faire ce que vous voulez:
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"])
qui imprime les éléments suivants:
In default method
hello world!
args:
arg1
arg2
in new default method
hello world2!
args:
arg1
arg2
Je comptais avoir à coder en Java ce, si l'on pouvait faire du tout! – bmargulies
+1 pour l'exemple de code sympa. –