prototype

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

Skvoznyak

Топикстартер
15 лет на форуме
Сообщения
5 500
Реакции
2 168
Вопрос следующий - с базовыми классами JS работает

Код:
Object.prototype.layerWidth=function()
{
return (this.bounds[2].value-this.bounds[0].value);
}

а я бы хотел добавить метод допустим только к Layer, а не ко всем объектам. Но как?

Код:
Application.Document.Layer.prototype.layerWidth=function()
или 
Layer.prototype.layerWidth=function()

не работает.

(пример от PhotoShop, вообще говоря, но это непринципиально)
 
Ответ: prototype

По какой-то необяснимой причине добавить метод к классу можно:

Код:
Layer.prototype.showName = function() {
    alert(this.name);
}
app.activeDocument.layers[0].showName();

а вот свойство нельзя (
 
Ответ: prototype

да, в inDesign работает. забавно, но в PhotoShop то же самое не работает - Layer is undefined
 
Ответ: prototype

да, в inDesign работает. забавно, но в PhotoShop то же самое не работает - Layer is undefined

Вам нужно или предварительно создать конструктор нужного класса

Код:
var Layer = function(){}
Layer.prototype.showName = function() {}

или дополнять встроенный:

Код:
ArtLayer.prototype.showName = function() {}

Примеры для Photoshop
 
Ответ: prototype

Второй вариант не работает (CS4 на OS X), а вот первый отлично сработал, спасибо!
 
Ответ: prototype

Забавно, похоже действительно мы с вами нашли что-то странное. Приведенный ниже код работает в Photoshop только если выполняется вторая строка, а в InDesign напротив, только без нее:

Код:
if (app.name.indexOf('Photoshop') > 0) {
    var Document = function(){} // эта строка необходима PS, но фатальна для ID
}
// дальше все работает одинаково
Document.prototype.showName = function() {
    alert(this.name);
}
app.documents.add().showName();
 
Ответ: prototype

Похоже, об этой особенности JavaScript как инструмента скриптинга в индизайне пишет Питер Карел на своём сайте:
http://www.kahrel.plus.com/indesign/scriptui-1-7.pdf
Уже вышел седьмой релиз этого документа.
Вот тут перевод на русский второго релиза — http://adobeindesign.ru/2010/12/26/scriptsui/
Скачайте перевод, на 29 странице объяснение, почему индизайн сваливается на похожей задаче:
Обратите внимание, что JavaScript требует, чтобы функция, определяющая окно, в котором отображается прогрессбар, была объявлена как глобальная переменная.
{/ Попробуйте в функции function progress_bar (stop) вместо w = new Window ("palette"); указать var w = new Window ("palette"); и вы на строке progress.value = i+1 получите ошибку ‘Object is invalid’. /}

Видимо, в примере этой темы строка
var Document = function()
объявляющая внутри функции переменную, которая должна быть глобальной, расценивается интерпретатором как недопустимая.
 
Ответ: prototype

Совершенно из другой оперы... И здесь нет ничего особенного - переменная объявленная внутри функции за ее пределами не определена, так и должно быть
 
Ответ: prototype

Скачайте перевод, на 29 странице объяснение, почему индизайн сваливается на похожей задаче:

Полагаю проблема в том, что когда функция завершает работу объект window сразу же уничтожается сборщиком мусора как не имеющий больше ссылок на себя. Можно переписать функцию progress_bar без засорения глобального пространства имен:

Код:
function progress_bar (stop) {
    var w = new Window ("palette");
    var pbar = w.add ("progressbar", undefined, 1, stop);

    pbar.w = w;             // safe window
    pbar.preferredSize = [300,20];
    w.show ();
    return pbar;
}
 
Ответ: prototype

Согласен, мой пример не из той оперы. : ))

Но неясно, правомерно ли в первом сообщении темы пытаться в индизайне определить ширину слоя.
Разве она есть?
На попытку узнать
app.documents[0].layers[0].bounds[2].value
ответ был
Error: Object does not support the property or method 'bounds'

Я считал, что слой -- логическое понятие, он определяет очередность объектов в стопе, а сам собственно слой границ не имеет. Или я не прав?


Строки, переопределяющие классы:
var Layer = function(){}
var Document = function(){}
возвращают ошибку "Document / Layer read only"
Значит, в индизайне эти базовые классы переопределять нельзя.

Прототипы методов добавлять можно. : ))

***
Можно переписать функцию progress_bar без засорения глобального пространства имен
Моя ссылка на перевод 2-й версии. В 7-й этот скрипт переписан. Примерно так, как Вы сказали.
 
Ответ: prototype

Но неясно, правомерно ли в первом сообщении темы пытаться в индизайне определить ширину слоя.
Разве она есть?

этот пример, как я указал, от фотошопа, там у слоя есть bounds. )
 
Статус
Закрыто для дальнейших ответов.