是原型在设计中

isPrototypeOf in indesign

本文关键字:原型      更新时间:2023-09-26

嗨,我是设计脚本的新手,想弄清楚对象是否是类的子类型。 示例:我想遍历所有页面项目并获取所有不是图形的内容:

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

如果永远不会匹配。有没有如何使用isPrototypeOf的例子?我必须做什么来测试对象是某种类型还是它的子类?

编辑:澄清一下,我正在尝试测试我是否有从图形继承的任何内容的实例。

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

你可能想要 instanceof 运算符。

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

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

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

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

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

你确定它不应该是

Graphic.isPrototypeOf(layer.allPageItems[i])

或类似的东西

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

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

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

所以简短的回答是,我没有办法检查我拿着一个物体,是someClass的instace还是它的孩子的。反思和isPrototypeOf都无济于事。

我可能会尝试在尝试捕获块中投掷,但认为这很丑陋。因此,我将使用adobe论坛上建议的解决方案,测试所有可能的继承人(来自基础的子类/类)和基类。这是丑陋而冗长的,但我还没有找到更好的解决方案。

编辑:这是来自Adobes示例之一的EXCEPRT,它允许开关语法避免无休止的if构造:

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