リンクをクリップボードにコピー
コピー完了
どんなタイミングでPathItemコンストラクタが定義されるのでしょうか。
初めからコンストラクタにアクセスすると未定義のエラーが出ます。
前もってインスタンスにアクセスしていると、コンストラクタが定義されているような挙動となります。
一例としてPathItemとしておりますが、他の(Illustratorオブジェクトモデルの)コンストラクタでも同様の挙動となるものがあります。
環境:
Illustrator 24.1.1
Windows 10 Pro
PathItem以外のオブジェクトを選択して実行すると、コメントアウトの結果が得られます。
(function () {
var doc = app.activeDocument;
try {
$.writeln(PathItem);
}
catch (error) {
$.writeln(error); // ReferenceError: PathItem は未定義です。
}
try {
$.writeln(doc.selection[0] instanceof PathItem);
}
catch (error) {
$.writeln(error); // ReferenceError: PathItem は未定義です。
}
try {
$.writeln(doc.pathItems[0] instanceof PathItem); // true
}
catch (error) {
$.writeln(error);
}
try {
$.writeln(doc.selection[0] instanceof PathItem); // false
}
catch (error) {
$.writeln(error);
}
try {
$.writeln(PathItem); // function PathItem() { [native code] }
}
catch (error) {
$.writeln(error);
}
})();
リンクをクリップボードにコピー
コピー完了
相変わらずえらいとこ突いてくるので、誰も答えませんがスクリプトエンジンが生成するタイミングを正確に知ってるのは中の人だけだと思います。と言っちゃうと芸がないので、実際に外から観察した経験則から言うと初めて実体にアクセスがあった時に大慌てで生成されるのではないかと思います。そういうことですよね?
リンクをクリップボードにコピー
コピー完了
ご返信ありがとうございます。
そういうことでした。経験則を教えていただき納得しました。
instanceofもですが、pInstance.constructorも同じように怪しい挙動で以前から気持ち悪かったのです。
少数派と思いますが、TypeScriptを介してExtendScriptを書いております。型ガードを崩さずにクラスの型チェックにする際、instanceofを使って楽したいというのも思惑でした。
TypeScript便利だけど、大げさに感じるところ。(ExtendScriptにTypeScriptを使うのが大げさかもれませんが、飽きるまでは)
// Type Assertion
let sel = app.activeDocument.selection![0];
if (sel.typename === "PathItem") {
sel = arg as PathItem;
// 続く
}
// ユーザー定義のType Guard
function isPathItem(arg: any): arg is PathItem {
return arg.typename === "PathItem";
}
let sel = app.activeDocument.selection![0];
if (isPathItem(sel)) {
// 続く
}
リンクをクリップボードにコピー
コピー完了
ツールキットがVS Codeへ移行する時にコードヘルパーどうするよ?ってなってTypeScript利用した補完を整備しましたが、ExtendScriptの実装自体がコンフリクト多くてどうするよ?ってなったところで……
なにもかもExtendScriptが古臭いことが原因なのですが(^-^;