Javascript indesign中的isPrototypeOf

Javascript indesign中的isPrototypeOf,javascript,adobe-indesign,Javascript,Adobe Indesign,您好,我是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

您好,我是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 {
    ....
  }
}
layer=app.activeDocument.layers[layerIndex];
对于(i=0;i
无论if nver如何匹配。有没有关于如何使用
isPrototypeOf
的示例?我必须做什么来测试一个对象是否属于某个类型或其子类

编辑:为了澄清,我正在尝试测试是否有从Graphic继承的任何内容的实例


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

你确定这不是应该的吗

Graphic.isPrototypeOf(layer.allPageItems[i])
或者类似的

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

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

您可能需要操作员

if (layer.allPageItems[i] instanceof Graphic) {
    alert("Graphic");
} else {
    ....
}
您也可以使用
isPrototypeOf
,但必须颠倒顺序,获取原型本身,而不是构造函数。所以看起来是这样的:

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

您可以通过调用getElements()方法来访问pageItem的本质。它返回原始材质的数组。 在页面上给定一个矩形(无其他内容):


显然这是不可能的,我在adobe论坛上也问了这个问题,结果是:

所以简单的回答是,我无法检查我是否持有一个对象,它是
someClass
的instace或其子对象。反射和
isPrototypeOf
help都不是

我可能尝试在一个尝试catch块中铸造,但认为这是丑陋的。因此,我将使用adobe论坛上建议的解决方案,测试所有可能的继承人(从基类继承的子类/类)和基类。这既丑陋又冗长,但我还没有找到更好的解决办法

编辑:这是adobes示例中的一个例外,它允许切换语法避免无休止的if构造:

switch (app.selection[myCounter].constructor.name){
    case "Rectangle":
    case "Oval":
    case "Polygon":
    case "GraphicLine":
    case "TextFrame":
        myObjectList.push(app.selection[myCounter]);
        break;
}

我不知道如何使用它,这就是为什么我问如果你不知道如何使用它,你怎么知道它的存在?你知道adobe delviers的一个文档,不幸的是它缺少示例(我知道有一些是indesign,…)更高版本是正确的,但是,如果测试的项目是图形的子类型,它不会告诉我是真的。这两种方法都不适用于图形类型,例如图像。我必须直接测试图像。
switch (app.selection[myCounter].constructor.name){
    case "Rectangle":
    case "Oval":
    case "Polygon":
    case "GraphicLine":
    case "TextFrame":
        myObjectList.push(app.selection[myCounter]);
        break;
}