在Javascript中,您可以定义具有属性a和b的对象,如下所示:
myObj={a:'a',b:'b'}
然后你可以像这样添加属性c
myObj.c = 'c'
与Groovy相同的是什么?我必须使用metaClass吗?
使用案例:Grails中的JSON转换器不会向响应添加瞬态属性,我只想将随机属性附加到对象列表的每个元素。
答案 0 :(得分:3)
您可以使用Map
,它具有类似的语法和行为:
def myObj [a:'a', b:'b']
myObj.c = 'c'
您还可以使用Closures附加行为,例如
myObj.sayHello = { -> println 'Hi' }
然后将其称为方法:
myObj.sayHello()
答案 1 :(得分:3)
引自Using methodMissing and propertyMissing:
Groovy还支持propertyMissing来处理属性解析尝试。对于getter,您使用带有String参数的propertyMissing定义:
class Foo {
def propertyMissing(String name) { name }
}
def f = new Foo()
assertEquals "boo", f.boo
对于setter,您添加第二个propertyMissing定义,该定义采用value参数:
class Foo {
def storage = [:]
def propertyMissing(String name, value) { storage[name] = value }
def propertyMissing(String name) { storage[name] }
}
def f = new Foo()
f.foo = "bar"
assertEquals "bar", f.foo
与methodMissing一样,您可能希望在运行时动态注册新属性以提高代码的性能。