有没有可能在不声明类的情况下创建对象?

有没有可能在不声明类的情况下创建对象 obj = {a: '1'}; console.log(obj.a)

67055 次浏览

在 Groovy 中,您必须始终提供正在创建的对象的类,因此在 Groovy 中没有与 JavaScript 的 object-Literal 语法等价的对象。

然而,Groovy 确实有一个 Map的文本语法,它在概念上非常类似于 JavaScript 对象,即两者都是属性或名称-值对的集合。

与上面的 JavaScript 等价的 Groovy 代码是:

def obj = [a: '1']
println obj.a

即使这里没有使用类名,您仍然在创建特定类(java.util.LinkedHashMap)的对象。上面的代码只是简写为:

def obj = new LinkedHashMap();
obj.a = '1'
println obj.a

Expando可能更类似于 JavaScript 对象,当您希望避免定义类的“开销”,或者希望在运行时向动态对象添加任意属性时,Expando非常有用。

有点惊讶的是,没有人提到扩展类。这在映射之上添加了额外的功能,因为您可以直接引用函数中的属性。下面的代码示例。

def expando = new Expando(a:"def")
expando.run = {def b ->
println("$a")
println("$b")
}
expando.run("ABC")


def map = [a:"def"]
map.run = {def b ->
println("$a") //THIS DOES NOT WORK.  You will get a missing property exception.
println("$b")
}
map.run("ABC")

印刷输出:

绝对的

ABC

Groovy.lang. MissingPropertyException

ABC (如果在 map.run 中注释掉 println ($a) ,println ($b)会打印出 ABC)

忽略输出中额外的换行符。花了很长时间把 def 和 ABC 放在连续的行上。

有关更多信息,请参见 扩展 API 文档

Groovy 对 json 有一个等价的表示法。唯一的区别是,它们对映射使用[ : ]而不是{}。因此,您可以清楚地将 json 转换为 Groovy 对象表示法。

import groovy.json.JsonOutput


def obj = [:] //define map
obj.batsmen = [] //define array
def b = [:]
b.name= "V. Kohli"
b.score = 55
b.strike = false


obj.batsmen.push(b)


//push second object
obj.batsmen.push(b)
println JsonOutput.toJson(obj)

这里我没有直接打印对象。因为它将打印方括号符号。

阅读整篇文章。 Https://metamug.com/article/groovy-for-javascript-developers.php

你可以使用 真实地图:

config = [
host    : '0.0.0.0',
user    : 'user1',
password: 'pass'
]


println("""
HOST: ${config.host}
USER: ${config.user}
PASS: ${config.password}
""")

您也可以返回一个文本映射作为函数返回值,而不必定义一个自定义类,例如 return [status: 200, body: 'abcdef'],然后在调用者中访问这些值,例如使用 response.status