複数形のプロパティから子要素のプロパティを呼ぶと、一気に子要素のプロパティを配列として得られることにいまさら気づきました。
一気に子要素のnameを取得
Safari = Application("Safari");
winNames = Safari.windows.name();
//=> ["お気に入り", "お気に入り", "お気に入り"]
子要素の子要素のプロパティも一気に取得できます。
子要素の子要素も可
tabsNames = Safari.windows.tabs.name()
//=> [["お気に入り"], ["お気に入り"], ["お気に入り", "お気に入り", "お気に入り", "お気に入り"]]
今まではArray.mapを使ってこう書いてました。
今まで
winNames = Safari.windows().map(function(win){
return win.name();
});
大幅なコード削減が期待できそうです。死にたい。
しかも動作がmapよりぜんぜん軽い気がする。
複数形のプロパティに()をつけた時点で配列になるので、つけたら出来ませんよ。
複数形のプロパティに()をつけたらもう配列
Safari.windows instanceof Array //=> false
Safari.windows() instanceof Array //=> true
//>> winNames = Safari.windows().name();
//!! Error on line 1: TypeError: undefined is not a function (evaluating 'Safari.windows().name()')
複数形のプロパティから.get()
が呼べないのはこれが理由だったのかな。
単数形のプロパティに()をつけた場合は.get()が呼び出されるので、それと同じく複数形のプロパティに()をつけて配列を取得する際も.get()が呼び出されると思って試してみたら.get()を呼べなかったので不思議に思ってました。
(追記: .length
は取得できません。複数形のプロパティ自体に.length
があるからです。)
(追記: .properties()
はエラーで無理でした。複数形のプロパティ自体の.properties()
を読み出そうとするからでしょうか。)