如何使用 extendscript 检查 属性 值是否只读?

How to check if a property value is readonly using extendscript?

我正在为 After Effects 编写一个脚本,该脚本从图层收集所有属性并将它们写入 XML 文件。当我从 XML 检索值时, 有些值是只读的,工具包会抛出错误。

有没有办法检查它,比如文件对象的只读属性? 即:layer.property().(只读||只读)

如果没有,有人可以告诉我我可以采取什么方法朝着正确的方向前进吗?

我认为您无法从 ESTK 中获取此信息。

您可以使用 'After Effects Scripting Guide Book' 检查并创建一个包含所有 'readonly' 属性的对象,然后检查该对象是否包含此 属性.

这里是 link 脚本指南: After-Effects-CS6-Scripting-Guide

考虑到项目中的第一项是其中包含固体的合成,这可行,但可以说它很笨拙,您需要能够构建(每个)字符串才能执行此操作-- 但也许您已经准备好这样做了:

var r;
r = testForReadability("app.project.items[1].layers[1].enabled");
alert(r);
r = testForReadability("app.project.items[1].layers[1].width");//a solid's width is NOT writable
alert(r);

function testForReadability(thisProperty) {
    var x;
    try {
        x = eval(thisProperty);
        eval(thisProperty + " = x;");
        return true;
    } catch(e) {
        return false;
    }
}

但是,这里会出现一小部分蠕虫病毒,因为如果设置了“启用脚本调试器”选项,“false”s 将不起作用。所以你需要做一个变通方法来检查这个设置并临时重置它(参见 http://aenhancers.com/viewtopic.php?f=8&t=189&p=554&hilit=debugger#p554

只需尝试覆盖它,然后将其还原,如下所示:

function isReadOnly(value, container) {
  var tmp = container[value];
  var tmp2;
  var coolString = "cool";
  try {
    container[value] = "cool";
  } catch (e) {
    return true
  }
  tmp2 = container[value];
  container[value] = tmp;
  return coolString != tmp2;
}

// true, navigator.platform is read only
console.log(isReadOnly("platform", navigator))

// false, window.parent is not read only
console.log(isReadOnly("parent", window))