2

こんにちは、indesignスクリプトは比較的新しいので、オブジェクトがクラスのサブタイプであるかどうかを確認したいと思います。例:すべてのページアイテムを繰り返し処理し、グラフィックではないものをすべて取得します。

layer = app.activeDocument.layers[layerIndex];

for (i = 0; i < layer.allPageItems.length; i++) {
  alert(layer.allPageItems[i].reflect.name)
  if(layer.allPageItems[i].isPrototypeOf (Graphic) ) {
    alert("Graphic");
  } else {
    ....
  }
}

ただし、ifnverが一致します。使い方の例はありますisPrototypeOfか?オブジェクトが特定のタイプまたはそのサブクラスであるかどうかをテストするには、何をする必要がありますか?

編集:明確にするために、私はグラフィックから継承したもののインスタンスがあるかどうかをテストしようとしています。

しかし、私が今見る限り、それは不可能のようです。

4

4 に答える 4

2

おそらくinstanceof演算子が必要です。

if (layer.allPageItems[i] instanceof Graphic) {
    alert("Graphic");
} else {
    ....
}

を使用することもできisPrototypeOfますが、順序を逆にして、コンストラクターではなくプロトタイプ自体を取得する必要があります。したがって、次のようになります。

if (Graphic.prototype.isPrototypeOf(layer.allPageItems[i])) {
    alert("Graphic");
} else {
    ....
}
于 2012-06-04T15:32:57.370 に答える
2

getElements() メソッドを呼び出すことで、pageItem の本質にアクセスできます。元のマテリアルの配列を返します。ページ上の四角形が与えられた場合 (他には何もありません):

app.activeDocument.allPageItems[0].getElements()[0] instanceof Rectangle //true;
于 2012-06-05T19:28:06.903 に答える
1

どうやらこれは不可能なようです。私はアドビ フォーラムで次の結果を尋ねました: http://forums.adobe.com/message/4461211#4461211

someClassつまり、簡単に言えば、インスタンスまたはその子であるオブジェクトを保持しているかどうかを確認する方法がありません。反射もisPrototypeOf助けもありません。

try catch ブロックでキャストしてみるかもしれませんが、これは見苦しいと考えます。したがって、アドビ フォーラムで提案されているソリューションを使用して、考えられるすべての継承者 (ベースから継承された子/クラス) とベース クラスをテストします。これは醜くて長いですが、私はより良い解決策を見つけていません。

編集: これは、アドビの例の 1 つからの抜粋です。これにより、無限の if 構造を回避するスイッチ構文が可能になります。

switch (app.selection[myCounter].constructor.name){
    case "Rectangle":
    case "Oval":
    case "Polygon":
    case "GraphicLine":
    case "TextFrame":
        myObjectList.push(app.selection[myCounter]);
        break;
}
于 2012-06-13T22:58:26.523 に答える
1

あなたはそれが想定されていないことを確信していますか

Graphic.isPrototypeOf(layer.allPageItems[i])

または何かのような

Graphic.prototype.isPrototypeOf(layer.allPageItems[i])

?

あなたの現在のバージョンは逆のように聞こえます。

于 2012-06-04T15:19:29.423 に答える