2017-01-27 33 views
3

我想列出一個JXA對象的所有方法。我試過幾個是用JavaScript在瀏覽器中的工作方法,但都沒有工作:如何查找JXA對象上的所有方法?

>> 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 "[email protected]" 

我怎樣才能獲得的所有JXA對象所擁有的方法列表?

回答

4

可以,通過使用對象的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

你應該能夠檢查對象的定義雖與'NSScriptSuiteRegistry'和'NSScriptClassDescription'使用JXA-ObjC橋 – Sancarn

+0

你介意給一個快速的代碼示例使用那些你所提到的? – gnis

0
  1. Apple事件對象模型(「可編寫腳本的應用程序」界面)是抽象關係圖,而不是OO DOM。它沒有「方法」,它有RPC +簡單的一流關係查詢。

  2. AEOM在當前的應用程序中是不可反省的。這是一些缺點之一,其中很多可以追溯到整個事情是一個非常大而且雄心勃勃的問題的快速和骯髒的第一個切割,這個問題被蘋果公司的管理層及時地解散了團隊v1.1發貨,推動其設計師退出。您可以做的最好的方法是在腳本編輯器中選擇「文件」>「打開字典」來閱讀應用程序的字典。仍然嚴重不足,但你會得到最好的結果(特別是現在,蘋果計劃在未來幾年內推出整個產品)。

  3. JXA是一種袋子。只是說。

+0

所以你說不要學習JXA?我真的只是希望Finder有一個簡單的腳本界面來執行諸如給定文件夾,查找所有子文件夾,獲取子文件夾中的特定文件並將它們複製到另一個文件夾。到目前爲止,對於什麼應該是非常簡單的任務來說,這似乎很荒謬而複雜。 – RobG

+0

@RobG JXA仍然非常強大,我會說,但它不像'Swift/ObjC'中的'腳本'那麼強大,如果可以稱之爲腳本的話......你應該能夠檢查對象的定義,儘管使用JXA-ObjC-Bridge的「NSScriptSuiteRegistry」和「NSScriptClassDescription」 – Sancarn

相關問題