2010-11-05 29 views
0

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

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 
+0

Je comptais avoir à coder en Java ce, si l'on pouvait faire du tout! – bmargulies

+0

+1 pour l'exemple de code sympa. –