終了

どんなタイミングでPathItemコンストラクタが定義されるのでしょうか。

Contributor ,
Jun 08, 2020 Jun 08, 2020

リンクをクリップボードにコピー

コピー完了

どんなタイミングで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);
    }
})();

 

キーワード
スクリプティング

表示

670

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 1 件の正解

Community Expert , Jun 10, 2020 Jun 10, 2020

相変わらずえらいとこ突いてくるので、誰も答えませんがスクリプトエンジンが生成するタイミングを正確に知ってるのは中の人だけだと思います。と言っちゃうと芸がないので、実際に外から観察した経験則から言うと初めて実体にアクセスがあった時に大慌てで生成されるのではないかと思います。そういうことですよね?

投票

翻訳

翻訳
Community Expert ,
Jun 10, 2020 Jun 10, 2020

リンクをクリップボードにコピー

コピー完了

相変わらずえらいとこ突いてくるので、誰も答えませんがスクリプトエンジンが生成するタイミングを正確に知ってるのは中の人だけだと思います。と言っちゃうと芸がないので、実際に外から観察した経験則から言うと初めて実体にアクセスがあった時に大慌てで生成されるのではないかと思います。そういうことですよね?

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Contributor ,
Jun 14, 2020 Jun 14, 2020

リンクをクリップボードにコピー

コピー完了

ご返信ありがとうございます。

そういうことでした。経験則を教えていただき納得しました。

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)) {
    // 続く
}

 

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jun 14, 2020 Jun 14, 2020

リンクをクリップボードにコピー

コピー完了

最新

 ツールキットがVS Codeへ移行する時にコードヘルパーどうするよ?ってなってTypeScript利用した補完を整備しましたが、ExtendScriptの実装自体がコンフリクト多くてどうするよ?ってなったところで……

なにもかもExtendScriptが古臭いことが原因なのですが(^-^;

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines