You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ClojureScript环境中如何以惯用方式通过变量获取JS对象属性?

动态访问JavaScript对象属性的惯用ClojureScript方式

好问题!在ClojureScript里处理JavaScript原生对象的动态属性访问,确实有比aget更贴合惯用风格的方案——毕竟aget的语义确实偏向数组/类数组对象的索引访问,用它处理对象属性总有点“错位”的感觉。

下面是两种推荐的惯用写法:

1. 使用Google Closure的goog.object/get

这是最稳妥、语义最清晰的方式,Google Closure库提供的goog.object/get专门用于JavaScript对象的属性获取,完美支持动态属性名(也就是你的field-name变量这种场景):

;; 先确认初始定义(如果原代码里的field-name是函数,就调用它:(field-name))
(def field-name "blah")
(def obj (js* "{ list: [1,2,3,4,5], blah: \"vtha\", o: { answer: 42 } }"))

;; 动态获取属性
(goog.object/get obj field-name) ; 返回 "vtha"

2. 使用Clojure核心函数get(ClojureScript 1.10+)

从ClojureScript 1.10版本开始,核心的get函数对JavaScript对象做了兼容支持,你可以用它以统一的方式处理Clojure map和JS对象,代码更简洁:

(get obj field-name) ; 同样返回 "vtha"

补充说明

  • 如果是静态属性名(提前知道属性叫blah),我们会惯用(.-blah obj)这种点语法,但因为你这里是用变量field-name动态指定属性名,点语法就不适用了。
  • 虽然aget确实能工作,但它的设计初衷是数组索引访问,用在对象上会让其他阅读代码的开发者困惑,所以不推荐作为惯用写法。

内容的提问来源于stack exchange,提问作者user9240263

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:54:46