如何查找 JXA 对象上的所有方法?

9

我想列出一个JXA对象的所有方法。我尝试了几种适用于浏览器JavaScript的方法,但都没有成功:

>> Object.getOwnPropertyNames(Application('Finder').selection()[0]);
=> ["__private__"]
>>
>> JSON.stringify(Application('Finder').selection()[0])
=> undefined
>>
>> console.dir(Application('Finder').selection()[0])
!! Error on line 1: TypeError: console.dir is not a function. (In 'console.dir(Application('Finder').selection()[0])', 'console.dir' is undefined)
>>
>> for(var m in Application('Finder').selection()[0]) { console.log(m); }
=> undefined
>>
>> console.log(Application('Finder').selection()[0])
2017-01-27 16:51:16.331 osascript[18617:633276] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFStringappendString:]: nil argument'
*** First throw call stack:
(
        0   CoreFoundation                      0x00007fff77feb0db __exceptionPreprocess + 171
        1   libobjc.A.dylib                     0x00007fff8cc7da2a objc_exception_throw + 48
        2   CoreFoundation                      0x00007fff780689c5 +[NSException raise:format:] + 197
####### SNIPPED FOR BREVITY ########
        45  Foundation                          0x00007fff799944ea -[NSRunLoop(NSRunLoop) run] + 76
        46  osascript                           0x000000010d4e0485 osascript + 9349
        47  libdyld.dylib                       0x00007fff8d55f255 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
/Users/example/Tools/my-tools/osascript: line 24: 18617 Abort trap: 6           reattach-to-user-namespace /usr/bin/osascript "$@"

我该如何获取JXA对象的所有方法列表?

2个回答

16
您可以使用对象的properties()方法获取该对象的属性列表(这些属性具有相应的方法):
>> Application('Finder').selection()[0].properties()
=> {
"class":"documentFile",
"name":"gist.sh",
"index":12,
"displayedName":"gist.sh",
"nameExtension":"sh",
"extensionHidden":false,
"container":Application("Finder").startupDisk.folders.byName("Users").folders.byName("example").folders.byName("Tools").folders.byName("my-tools"),
"disk":Application("Finder").startupDisk,
"position":{
    "x":-1, 
    "y":-1
},
"desktopPosition":null,
"bounds":{
    "x":-33,
    "y":-33,
    "width":64,
    "height":64
},
"kind":"shell script",
"labelIndex":0,
"locked":false,
"description":null,
"comment":"",
"size":804,
"physicalSize":4096,
"creationDate":Thu Jan 19 2017 13:47:43 GMT-0500 (EST),
"modificationDate":Thu Jan 19 2017 13:47:43 GMT-0500 (EST),
"icon":null,
"url":"file:///Users/example/Tools/my-tools/gist.sh",
"owner":"example",
"group":"(unknown)",
"ownerPrivileges":"read write",
"groupPrivileges":"read only",
"everyonesPrivileges":"read only",
"fileType":null,
"creatorType":null,
"stationery":false,
"productVersion":"",
"version":""
}
任何这些属性都可以被调用为一种方法来检索值:
>> Application('Finder').selection()[0].owner()
=> "example"
>> Application('Finder').selection()[0].displayedName()
=> "gist.sh"

请注意,此列表不包括所有方法。另外,properties() 方法并非所有对象都可以调用。


1
你应该能够使用JXA-ObjC-Bridge通过NSScriptSuiteRegistryNSScriptClassDescription检查对象的定义。 - Sancarn
你介意给一个快速的代码示例来使用你提到的吗? - hyunchel

2
  1. 苹果事件对象模型(一种“可脚本化应用程序”接口)是一个抽象的关系图,而不是面向对象的DOM。它没有“方法”,只有RPC + 简单的一级关系查询。

  2. AEOM在当前应用程序中不具有内省能力。这是许多缺点之一,其中许多可以追溯到整个问题的快速和肮脏的第一次尝试,这个问题非常大且雄心勃勃,但很快被愚蠢的苹果管理层解散了团队,在v1.1发布后驱使其设计师离职。你能做的最好的事情就是通过选择Script Editor中的File > Open Dictionary来阅读应用程序的字典。仍然非常不足,但这是你能得到的最好的(特别是现在苹果看起来将在未来几年逐步停止整个项目)。

  3. JXA是一堆垃圾。只是说说而已。


你的意思是不用学习JXA吗?我只是希望有一个简单的脚本界面来操作Finder,例如在给定文件夹中查找所有子文件夹、获取子文件夹中的特定文件并将它们复制到另一个文件夹。到目前为止,这个看起来非常笨拙和复杂,对于应该非常简单的任务来说。 - RobG
@RobG 我认为JXA仍然非常强大,但不如在Swift/ObjC等语言中进行“脚本编写”那样强大,如果这可以被称为脚本编写的话... 你应该能够使用JXA-ObjC-Bridge检查对象的定义,其中包括NSScriptSuiteRegistryNSScriptClassDescription - Sancarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接