使用 JXA 访问对象的属性

Accessing properties of object using JXA

我正在尝试使用 JXA 访问名为 Papers3 的应用程序中对象的属性。我是 JXA 的新手,事实证明这很有挑战性,尤其是因为缺少文档。

这是我要查看的对象的字典截图

我正在尝试获取应用中当前显示的 windows 的 ID。

我的尝试是:

var Papers = Application('Papers');
Papers.includeStandardAdditions = true
Papers.libraryWindow.displayedPublications()

运行 它抛出一个错误并且输出是:

Error on line 4: TypeError: Papers.libraryWindow.displayedPublications is not a function. (In 'Papers.libraryWindow.displayedPublications()', 'Papers.libraryWindow.displayedPublications' is undefined)

Error -2700: Script error.

此外,如果我只调用 Papers.libraryWindow

结果是:

  [function anonymous] {
  "name":"", 
  "prototype":{"constructor":[function anonymous]}
}

我不知道该怎么做。

有关论文 3 的特定 JXA 示例,请参阅:
mac-scripting - Automation scripts for macOS

有关更多一般信息,请参阅:
JXA Resources

我认为这是一个小细节。 libraryWindow 需要是复数,需要指定是哪一个。您可以使用多种形式:

  • 索引形式 例如。 libraryWindows[0]

  • ByName 例如。 libraryWindows.byName('Papers')

    因此,要访问第一个库 window,您可以使用:libraryWindows[0].

试试这个:

(() => {
    'use strict'

    const app = Application('Papers');
    const oWin = app.libraryWindows[0]

    return oWin.displayedPublications()
})();

好吧,JXA 是被破坏的混淆的垂死垃圾,AS 也好不了多少,但这里要理解的关键是 Apple 事件 IPC 不是 OOP,它是 RPC + simple first-class关系查询。尽管语法糖,它最接近的亲戚实际上是 SQL 数据库编程,而不是浏览器 DOM 操作,所以一旦你明白了它就会 [希望] 开始变得更有意义。

一个“AppleScriptable”应用程序将其数据呈现​​为一个高度抽象的关系图——一个“Apple 事件对象模型”——其中每个节点都通过一对一 and/or 一对一的方式与其他节点相关- 很多关系。没有面向对象意义上的“classes”或“对象”之类的东西;这只是为了文档目的而附加的行话。因此,应用程序的字典称为“属性”的是一个包含原始值(数字、字符串、列表等;例如 Finder [=11] 的 name 属性 的简单属性=]) 或一对一的关系(例如 iTunes 的 applicationcurrent track 属性),它所谓的“元素”是一对多的关系(在您的例子中,Papers 的 application 对象的 libraryWindows 元素)。

例如,Papers.libraryWindows.displayedPublications.get() 应该 return Papers 中每个图书馆 window 的显示出版物列表(尽管实际上是否在实践中的工作取决于应用程序的 AEOM 的实施情况,更不用说 JXA 自己的实施问题);或者您可以使用各种参考形式(按索引、按名称等;尽管 JXA 中有几个是 broken/unsupported)来缩小您的查询范围,例如,仅第一个库 window,例如Papers.libraryWindows[0].displayedPublications.get().

您可能会通过浏览 NodeAutomation 文档获得一些见解,其中包括 rough overview of AEOM 以及如何 assemble 查询,然后您可以通过命令(远程过程调用)将查询发送给它以解决和处理认为合适。 JXA 语法不是那么漂亮,各种操作在 JXA 的 AS barf 中完美运行,但它会给你一个大概的概念。

也就是说,我强烈建议坚持使用 AppleScript。这门语言一团糟,但至少它有 一些 文档和用户社区来帮助你找到解决它的方法(即使他们也不深入理解它)。