定義方法は3種類あります。まず、スクリプト内に記述する方法。
気を付けるのは、スクリプトの最初の方で定義する事と、parent属性を設定する場合は、親を先に子を後に定義する事です。
詳しい理由は、「有効範囲の変化」を参照して下さい。
この場合、スクリプトオブジェクトと同名の変数に自動的に代入されます。
この変数の有効範囲は、大域変数に準じます。詳しくは「大域変数の有効範囲」を参照して下さい。
script X
end script
定義された変数はsetで同じスクリプトオブジェクトを指し、copyで別のスクリプトオブジェクトとして新たに作られます。
属性は、スクリプトを実行した時に初期化されます。
この性質は、日付やリスト、レコードと同じです。
script X
property testProp_ : 0
end script
set yObj to X
copy X to zObj
set testProp_ of X to 100
{testProp_ of X, testProp_ of yObj, testProp_ of zObj}-- 属性はsetで共有され、copyで別に管理される
--> {100, 100, 0}
つぎに、ハンドラを呼び出す方法。
この場合、ハンドラからの返り値を変数に代入するのを忘れないようにします。
ハンドラの中では変数が作られます(下の例ではX)が、これは局所変数です。
return Xは、定義の直後はresultがXと同じ値となっているので、省略可能になっています。詳しくは「暗黙と明示」を参照して下さい。
また、returnを省略した場合、scriptの後の識別子も必要ありません。
set yObj to makeObj()
on makeObj()
script X
end script
return X -- 省略可能
end makeObj
ハンドラを呼び出すたびに属性が初期化され、新しくスクリプトオブジェクトが作られていきます。
その際、ハンドラに渡した引数で属性を初期化する事もできます。
初期化以外は、copyでスクリプトオブジェクトを変数に代入する場合と同じように、属性は共有されません。
set yObj to makeObj(0)
set zObj to makeObj(1)
set testProp_ of yObj to 100
{testProp_ of yObj, testProp_ of zObj} -- それぞれに属性が管理される
--> {100, 1}
on makeObj(theProp)
script
property testProp_ : theProp
end script
end makeObj
特に沢山のスクリプトオブジェクトを用意する必要がある場合、ハンドラで呼び出してリストに貯えるのが楽です。
このようにしておくと、かなりアプリケーションオブジェクトと近い感覚でスクリプトオブジェクトを利用する事ができます。
set listObjects to {}
repeat with i from 1 to 20
set end of listObjects to makeObj(i)
end repeat
tell listObjects -- リストをコンテナオブジェクト的に利用
set testProp_ of item 1 to 100
{testProp_ of item 1, testProp_ of item 2} -- それぞれに属性が管理される
--> {100, 2}
end tell
on makeObj(theProp)
script
property testProp_ : theProp
end script
end makeObj
最後は、load script命令を使う方法。
これも変数に代入する事を忘れないようにします。
読み込むのはコンパイル済みスクリプトでも、アプレットでも構いません。一応テキストでも構いませんが、構文確認(コンパイル)に時間がかかりますし、構文に誤りがあった場合は当然エラーとなります。
読み込まれる方のスクリプトではスクリプトオブジェクトの定義をしておく必要はなく、基本的には普通にスクリプトを書いておけばload scriptでスクリプトオブジェクトとして読み込む事ができ、これはAppleScriptの優れた特徴と言えます。
set yObj to load script (choose file)
スクリプトオブジェクトが外部にあるので、「スクリプト編集プログラム」で32KB以上のスクリプトを利用する手段としても使えます。
また、システムフォルダの「スクリプト」フォルダなどに良く使うコンパイル済みスクリプトを置いて、モジュール(ライブラリ)的に利用するのが一般的な利用法でしょう。
以下のスクリプトでは、「スクリプト」フォルダに"test.scr"というファイル名でスクリプトを置いているとして、スクリプトを書いています。
set path2Script to (path to scripts folder) as string
set yObj to load script file (path2Script & "test.scr")
このように幾つか定義方法がありますから、利用方法に合わせた定義を行うといいでしょう。