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 {
    ....
  }
}

但是 if nver 匹配。有没有例子说明如何使用isPrototypeOf?我必须做什么来测试一个对象是某种类型还是它的子类?

编辑:为了澄清,我试图测试我是否有一个从 Graphic继承的任何东西的实例。

但据我现在所见,这似乎是不可能的。

4

4 回答 4

2

您可以通过调用 getElements() 方法来访问 pageItem 的本质。它返回原始材质的数组。给定页面上的一个矩形(仅此而已):

app.activeDocument.allPageItems[0].getElements()[0] instanceof Rectangle //true;
于 2012-06-05T19:28:06.903 回答
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 回答
1

你确定它不应该是

Graphic.isPrototypeOf(layer.allPageItems[i])

或类似的东西

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

?

您当前的版本听起来像是倒退。

于 2012-06-04T15:19:29.423 回答
1

显然这是不可能的,我也在 adobe 论坛上询问了这个结果: http ://forums.adobe.com/message/4461211#4461211

所以简短的回答是,我无法检查我是否持有一个对象,它是它的实例someClass还是子对象。既没有反思也没有isPrototypeOf帮助。

我可能会尝试在 try catch 块中进行强制转换,但认为这很丑陋。因此,我将采用 adobe 论坛上建议的解决方案,测试所有可能的继承人(从基类继承的孩子/类)和基类。这既丑陋又冗长,但我还没有找到更好的解决方案。

编辑:这是 adobes 示例之一的摘录,它允许 switch 语法避免无休止的 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 回答