Расширение объектов через prototype

  • Автор темы Автор темы dim4an
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

dim4an

Участник
Топикстартер
Сообщения
93
Реакции
1
Всем привет. Имеется объект TextFrame. Мне необходимо его расширить и добавить методы и свойства. Методы я добавляю вот так
Код:
TextFrame.prototype.someMethod = function() {...}
все экземпляры объекта TextFrame будут иметь метод someMethod, он будет работать, все ок. Теперь я хочу добавить свойство, допустим
Код:
TextFrame.prototype.someProperty = true;
код выполнится, но экземпляры объекта TextFrame не будут иметь это свойство.
Вопрос, почему и как можно реализовать данную идею?
 
Честно говоря, не пойму, зачем? Стандартную объектную модель вы все равно не переопределите.
 
Честно говоря, не пойму, зачем? Стандартную объектную модель вы все равно не переопределите.

у меня происходит генерация множества таблиц с картинками и прочей информации. Мне бы было удобно, в объект TextFrame ложить какаю то дополнительную информацию о таблице (допустим таблица: может ли сплититься, таблица в 2 колонки, есть ли у таблицы зависимые страницы и т.д). Мне бы это очень упростило бы алгоритм.
 
Хотя сейчас думаю использовать для этих целей объект обвертку, дабы получить подобную структуру
Код:
var obj = {
            someProperty1: ...,
            someProperty2: ...,
            someProperty3: ...,
            template: myTamplate
}
В принципе, мои задачи это решит. Но все равно остается вопрос, почему я могу добавить объекту функцию, но не могу добавить свойство.
 
В принципе, мои задачи это решит. Но все равно остается вопрос, почему я могу добавить объекту функцию, но не могу добавить свойство.
Вышеуказанным образом вы не добавляете объекту ни методов ни свойств. Вы просто создаете словарь, в котором объекту искусственно поставлены в соответствие несколько переменных. В принципе вы можете и методы таким же образом туда воткнуть (через блоки кода), но это несколько не топикстартовая задача. А вообще, то что вы реально хотите, делается совсем не так. У каждого элемента верстки есть свойство label. А вот туда можно пихать все что угодно, хоть методы, хоть свойства, главное свой парсер написать. И будет все в рамках существующей модели, при чем, вся эта структура еще и в публикациях сохраняться будет.
 
Вышеуказанным образом вы не добавляете объекту ни методов ни свойств. Вы просто создаете словарь, в котором объекту искусственно поставлены в соответствие несколько переменных. В принципе вы можете и методы таким же образом туда воткнуть (через блоки кода), но это несколько не топикстартовая задача. А вообще, то что вы реально хотите, делается совсем не так. У каждого элемента верстки есть свойство label. А вот туда можно пихать все что угодно, хоть методы, хоть свойства, главное свой парсер написать. И будет все в рамках существующей модели, при чем, вся эта структура еще и в публикациях сохраняться будет.

вы меня заинтриговали :).
В данный момент, свойство label у меня используется для идентификации элементов темплейта. У каждого элемента есть свое имя, по которому я к нему обращаюсь.
Если отталкиваться от вашего комментария, выходит что я могу с лабелом сделать что то подобное
Код:
textFrame.label = {
                  name : "myName",
                  prop1: true,
                  prop2: 0
                  }
и соответственно обращаться к свойствам textFrame.label.name. Если это так, то это очень здорово :). Но вот тогда совсем не понятно с методами. Если я реализую метод в лабеле, то ведь я не смогу получить доступ к самому textFrame(у) через this. Как допустим я делаю через прототайп вот в таком методе
Код:
TextFrame.prototype.getHeight = function () {
    return this.geometricBounds[2] - this.geometricBounds[0];
}

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

Да, реально работает. Он инициализируется постоянно, при инициализации скрипта, по поводу сохранения его в файл, не могу сказать. Вот только свойство таким же способом я не могу задать. Наверно стоило изначально сказать, что я использую Indesign Server 6.
Возвращаясь к теме о скрипт label. Тогда получается, что свойства записываются в виде строки, а потом парсером (с применением регулярных выражений) они изымаются, так?
 
Возвращаясь к теме о скрипт label. Тогда получается, что свойства записываются в виде строки, а потом парсером (с применением регулярных выражений) они изымаются, так?
Нет не так. Вот как то так:
Код:
d.label="a={prop1:1,method1:function(){return 2;}};";
alert(eval(d.label).prop1);
alert(eval(d.label).method1());
 
  • Спасибо
Реакции: dim4an
В принципе, мои задачи это решит. Но все равно остается вопрос, почему я могу добавить объекту функцию, но не могу добавить свойство.

Вот такое ограничение, к сожалению. Что интересно - классам ScriptUI (по крайней мере, некоторым) в отличие от классов InDesign/Photoshop/Illustrator свойство можно добавить
 
На самом деле, при здравом рассмотрении, и это препятствие большим ограничением не является. К примеру, раз все равно вся модели переинициализируется при загрузке скрипта, то можно организовать на каждое свойство по два метода setValue() и getValue()
 
Можно. А value где держать?
 
В глобальной переменной или в том же label.
 
вообще говоря, есть уже такие методы, и не надо ничего выдумывать )

PageItem.insertLabel (key: string , value: string )
Adobe InDesign CS6 (8.0) Object Model
Sets the label to the value associated with the specified key.
key: Data Type: string
The key.
value: Data Type: string
The value.

PageItem.extractLabel (key: string ): string
Adobe InDesign CS6 (8.0) Object Model
Gets the label value associated with the specified key.
key: Data Type: string
The key.

Также можно смотреть в сторону XML - в атрибутах, например можно хранить информацию
 
  • Спасибо
Реакции: dim4an
Все это замечательно, но CS6
Вдобавок, по сути, это то же добавление дополнительного строкового лэйбла :(
 
ну только обычный label переписать кто угодно может, а тут можно сделать уникальный ключ.

методы эти по-моему существуют спокон веков

PageItem.insertLabel (key: string , value: string )
Adobe InDesign CS6 (3.0) Object Model
 
И вправду были, не туда посмотрел.
 
вообще говоря, есть уже такие методы, и не надо ничего выдумывать )

PageItem.insertLabel (key: string , value: string )
Adobe InDesign CS6 (8.0) Object Model
Sets the label to the value associated with the specified key.
key: Data Type: string
The key.
value: Data Type: string
The value.

PageItem.extractLabel (key: string ): string
Adobe InDesign CS6 (8.0) Object Model
Gets the label value associated with the specified key.
key: Data Type: string
The key.

Также можно смотреть в сторону XML - в атрибутах, например можно хранить информацию

Век живи, век учись :). Только вот не совсем понятно, эти свойства записываются не в сам label, а куда то еще? В индизайне не видно что я записал в лабел таким способом
 
В индизайне не видно что я записал в лабел таким способом
К примеру, если экспортировать в IDML, то в одном из файлов Spread_??.xml появится такой код:
Код:
...
                                <Label>
                                        <KeyValuePair Key="label1" Value="My label 1"/>
                                </Label>
...
 
  • Спасибо
Реакции: dim4an
Век живи, век учись :). Только вот не совсем понятно, эти свойства записываются не в сам label, а куда то еще? В индизайне не видно что я записал в лабел таким способом

ну а зачем вам нужно, чтоб это было видно пользователю? extractLabel в скрипте делайте и смотрите
 
Статус
Закрыто для дальнейших ответов.