【问题标题】:rhino dynamic properties for JavascriptJavascript 的 rhino 动态属性
【发布时间】:2010-11-06 20:21:10
【问题描述】:

在 Rhino 中,我可以通过在 Java 类上定义 js... 函数来添加特定属性。我想要的是定义一个包罗万象的函数,如果程序要引用一个尚未以其他方式定义的属性,则该函数会被调用。有什么办法吗?

【问题讨论】:

    标签: rhino


    【解决方案1】:

    我认为没有办法使用原生语法来表达这个概念,即使使用 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   
    

    【讨论】:

    • 如果可以的话,我原以为必须用 Java 编写代码!
    猜你喜欢
    • 2021-09-26
    • 2020-05-25
    • 2010-11-17
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2015-07-10
    • 2016-11-04
    相关资源
    最近更新 更多