【问题标题】:How can I find out all the methods on a JXA object?如何找出 JXA 对象上的所有方法?
【发布时间】:2017-06-13 17:09:48
【问题描述】:

我正在尝试列出 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 对象具有的所有方法的列表?

【问题讨论】:

    标签: javascript javascript-automation


    【解决方案1】:

    您可以使用对象的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() 方法不能在所有对象上调用。

    【讨论】:

    • 您应该能够使用 JXA-ObjC-Bridge 使用 NSScriptSuiteRegistryNSScriptClassDescription 检查对象的定义
    • 您介意提供一个快速代码示例来使用您提到的那些吗?
    【解决方案2】:
    1. Apple 事件对象模型(“可编写脚本的应用程序”接口)是一个抽象的关系图,而不是 OO DOM。它没有“方法”,它有 RPC + 简单的一级关系查询。

    2. AEOM 在当前应用程序中不可自省。这是许多缺点之一,其中许多可以追溯到整个事情是对一个非常大和雄心勃勃的问题的快速而肮脏的第一次削减,这被愚蠢的苹果管理层迅速破坏了,之后立即解散了团队v1.1 发布,迫使其设计师退出。您可以做的最好的事情是通过在脚本编辑器中选择“文件”>“打开字典”来阅读应用程序的字典。仍然严重不足,但你会得到最好的(尤其是现在苹果看起来将在未来几年内结束整个事情)。

    3. JXA 是一个袋子球。只是说说而已。

    【讨论】:

    • 所以您是说不要费心学习 JXA?我真的只是希望 Finder 有一个简单的脚本界面来处理给定文件夹、查找所有子文件夹、获取子文件夹中的特定文件并将它们复制到另一个文件夹等操作。到目前为止,对于本应非常简单的任务来说,它似乎过于臃肿和复杂。
    • @RobG JXA 我会说仍然非常强大,但不如 Swift/ObjC 之类的“脚本”强大,如果这可以称为脚本的话......你应该能够使用 JXA-ObjC-Bridge 使用 NSScriptSuiteRegistryNSScriptClassDescription 检查对象的定义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2013-03-22
    相关资源
    最近更新 更多