isPrototypeOf in indesign

时间:2012-06-04 15:13:40

标签: javascript adobe-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 {
    ....
  }
}

如果nver匹配的话。有没有关于如何使用isPrototypeOf的示例?如果某个对象属于某种类型或其子类,我该怎么办呢?

编辑:为了澄清,我正在尝试测试我是否有来自Graphic的<​​em>继承的任何实例。

但据我所知,这似乎是不可能的。

4 个答案:

答案 0 :(得分:2)

您可能需要instanceof运算符。

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

你也可以使用isPrototypeOf,但你必须颠倒顺序并获得原型本身,而不是构造函数。所以它看起来像这样:

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

答案 1 :(得分:2)

您可以通过调用getElements()方法来访问pageItem的本质。它返回原始材质的数组。 在页面上给出一个矩形(没有别的):

app.activeDocument.allPageItems[0].getElements()[0] instanceof Rectangle //true;

答案 2 :(得分:1)

你确定它不应该是

Graphic.isPrototypeOf(layer.allPageItems[i])

或类似

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

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

答案 3 :(得分:1)

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

所以简短的回答是,我无法检查我是否持有someClass或其子女的实体。无论是反思还是isPrototypeOf都没有帮助。

我可能会尝试在try catch块中进行转换,但认为这很难看。因此,我将使用adobe论坛上建议的解决方案,测试所有可能的继承人(从基地开始的子项/类)和基类。这是丑陋和漫长的,但我没有找到更好的解决方案。

编辑:这是adobes示例中的一个例外,它允许切换语法避免使用无穷无尽的构造:

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