Почему объекты Extendscript становятся недействительными при создании внутри функции?

function addControl(layer, name){
    newCtrl = layer("Effects").addProperty("Slider Control");
    newCtrl.name = name;
    return newCtrl;
}
var Slider1 = addControl(ExistingLayer, "slider 1");
$.write(Slider1.name);
var Slider2 = addControl(ExistingLayer, "slider 2");
$.write(Slider1.name);

Код ошибки № 45: недопустимый объект

Попытка получить доступ к Slider1.name после создания Slider2 приводит к ошибке, поскольку Slider1 теперь [Invalid Object]

Я чувствую, что это как-то связано со ссылками и сборкой мусора, но поскольку объекты javascript должны передаваться как ссылка, а «addProperty» должен создавать новый объект, я не понимаю, почему.

Я должен добавить, что он не работает с ключевым словом «var» и без него.


person Kez    schedule 16.03.2021    source источник


Ответы (1)


Это из-за ужасного API. После того как вы добавили или удалили свойство, например эффект, к слою или слой к композиции, любые ссылки на все эффекты в этом слое или слоях в композиции становятся недействительными. Вы должны либо отслеживать все текущие эффекты, которые есть на слое, и ссылаться на них по индексам, либо добавлять к ним идентифицирующее свойство и циклически перебирать доступные свойства, соответствующие идентификатору. Например, при создании эффекта

newCtrl.identifier = "ctrl"+ id; //where id is a unique string or number

а потом перебираешь эффекты слоя и ищешь идентификатор

if (thisEffect.identifier === "ctrl"+ id){
    dostuff()
}
person stib    schedule 17.03.2021
comment
На самом деле достаточно просто отслеживать «имя», например, уже существующийLayer.Effects.property(name) может получить новую ссылку. Но, по крайней мере, теперь я знаю, что не делаю ничего плохого. Вы правы, это ужасный API. - person Kez; 17.03.2021
comment
Да, пока имя уникально. - person stib; 18.03.2021