динамические свойства носорога для Javascript - PullRequest
0 голосов
/ 06 ноября 2010

В Rhino я могу добавить определенные свойства, определив функции js ... в классе Java. Я хотел бы определить функцию catchall, которая вызывается, если программа обращается к свойству, которое не было определено иначе. Есть ли способ?

1 Ответ

2 голосов
/ 06 ноября 2010

Я не думаю, что есть способ выразить эту концепцию, используя собственный синтаксис, даже используя проприетарные расширения Rhino / 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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...