I'm trying to list all the methods of a JXA object. I've tried several methods that work with JavaScript in the browser, but none have worked:
>> 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 "$@"
How can I get a list of all the methods that JXA object has?
You can obtain a list of an object's properties (which have corresponding methods), by using the object's properties()
method:
>> 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":""
}
Any of these properties can be called as a method to retrieve the value:
>> Application('Finder').selection()[0].owner()
=> "example"
>> Application('Finder').selection()[0].displayedName()
=> "gist.sh"
Note that this list does not include all methods. Also the properties()
method cannot be called on all objects.
The Apple Event Object Model (a "scriptable app" interface) is an abstract relational graph, not an OO DOM. It doesn't have "methods", it has RPC + simple first-class relational queries.
The AEOM is not introspectable in current apps. This is one of a number of shortcomings, many of which can be traced back to the whole thing being a quick-and-dirty first cut at a very large and ambitious problem, which was promptly scuppered by idiot Apple management disbanding the team right after v1.1 shipped, driving its designers to quit. The best you can do is read the app's dictionary by choosing File > Open Dictionary in Script Editor. Still grossly inadequate, but the best you'll get (especially now that Apple looks set to wind down the whole thing in the next few years).
JXA is a bag o'balls. Just saying.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With