Замечания к данному выпуску.

Эта статья описывает JavaScript для Автоматизации, новой функции в OS X Yosemite.

Содержание:

Введение

JavaScript для Автоматизации является серверной средой для JavaScript, добавляющего следующие глобальные свойства:

Компонент OSA

Компонент JavaScript OSA реализует JavaScript для Автоматизации. Компонент может использоваться от Редактора сценариев, глобального Меню Сценария, в Выполнении JavaScript Действие Automator, апплеты/капельки, osascript инструмент командной строки, NSUserScriptTask API, и везде еще другие компоненты OSA, такие как AppleScript, могут использоваться. Это включает Почтовые Правила, Действия Папки, Плагины Адресной книги, Календарные Предупреждения и сообщение Триггеры.

Сценарии словарей

Сценарии словарей детализируют объектную модель приложений. Терминология в сценариях словарей отображается на допустимых идентификаторах JavaScript после ряда соглашений. Средство просмотра Словаря Сценария в Редакторе сценариев было обновлено для показа терминологии в AppleScript, JavaScript и Objective C (Пишущий сценарий платформы Моста) форматы. Можно открыть словарь сценариев в Редакторе сценариев при помощи команды File> Open Dictionary или команды Window> Library.

Объектные спецификаторы

Многие объекты в JavaScript для серверной среды Автоматизации относятся к внешним объектам, таким как другие приложения, или окна или данные в тех других приложениях. При доступе к свойству JavaScript объекта приложения, или элемента объекта приложения новый объектный спецификатор возвращается, который относится к определенному свойству того объекта. Важно отметить, что этот объект не является фактическим значением свойства внешнего объекта; это - ссылка на объект. Получать значение свойства, на которое ссылаются, дополнительный шаг требуется, описывается в разделе Getting и Setting Properties.

Доступ к приложениям

К приложениям можно получить доступ этими способами:

  1. Имя

    Application('Mail')
  2. Пакет ID

    Application('com.apple.mail')
  3. Путь

    Application('/Applications/Mail.app')
  4. Процесс ID

    Application(763)
  5. Получение приложения на удаленной машине

    Application('eppc://127.0.0.1/Mail')
  6. Получение приложения, выполняющего сценарий

    Application.currentApplication()

Примеры синтаксиса

Это примеры синтаксиса для взаимодействия с объектами:

  1. Доступ к свойствам

    Mail.name
  2. Доступ к элементам

    Mail.outgoingMessages[0]
  3. Вызов команд

    Mail.open(...)
  4. Создание новых объектов

    Mail.OutgoingMessage(...)

Получение и установка свойств

К свойствам сценариев объектов получают доступ как свойства JavaScript с помощью записи через точку. Как описано выше, возвращенный объект является объектным спецификатором; ссылка на свойство, к которому получают доступ, а не фактическое значение. Чтобы отправить «получить» событие во внешний объект и возвратить его значение, Вы вызываете свойство как функцию:

subject = Mail.inbox.messages[0].subject()

Точно так же установка свойства отправляет событие «набора» во внешний объект с данными, которые Вы хотите установить.

Mail.outgoingMessages[0].subject = 'Hello world'

Вот пример получения свойства от каждого элемента массива (в этом случае, предмет каждого сообщения в ящике входящих сообщений Почты).

subjects = Mail.inbox.messages.subject()

Массивы элемента

К элементам получают доступ путем вызова определенных методов на массивах или использования квадратных скобок. Возвращенные значения являются объектными спецификаторами с их собственными свойствами и элементами, относящимися к элементам матрицы. Ими можно получить доступ:

  1. Индекс

    window = Mail.windows.at(0)
    window = Mail.windows[0]
  2. Имя

    window = Mail.windows.byName('New Message')
    window = Mail.windows['New Message']
  3. ID

    window = Mail.windows.byId(412)

    Примечание: Доступ ID не имеет сокращения квадратной скобки.

Фильтрация массивов

Для фильтрации массивов, возвращая только некоторые элементы, Вы можете, использовал специальное предложение whose метод для массивов. Вот общий синтаксис:

someElementArray.whose({...})

Вы передаете в объекте, содержащем критерии запроса. Можно проверить на:

  1. Литеральные соответствия свойства

    { name: 'JavaScript for Automation' }
    { name: { _equals: 'JavaScript for Automation' } }
    { name: { '=': 'JavaScript for Automation' } }
  2. Соответствия свойства, содержащие значение

    { name: { _contains: 'script for Auto' } }
  3. Соответствия свойства, начинающиеся со значения

    { name: { _beginsWith: 'JavaScript' } }
  4. Соответствия свойства, заканчивающиеся значением

    { name: { _endsWith: 'Automation' } }
  5. Соответствия свойства, больше, чем значение

    { size: { _greaterThan: 20 } }
    { size: { '>': 20 } }
  6. Соответствия свойства, больше, чем или равный значению

    { size: { _greaterThanEquals: 20 } }
    { size: { '>=': 20 } }
  7. Свойство соответствует меньше, чем значение

    { size: { _lessThan: 20 } }
    { size: { '<': 20 } }
  8. Свойство соответствует меньше чем или равный значению

    { size: { _lessThanEquals: 20 } }
    { size: { '<=': 20 } }
  9. Соответствия свойства подэлементов

    { _match: [ ObjectSpecifier.tabs[0].name, 'Apple' ] }

    Примечание: _match ключ берет массив в качестве своего значения.

Можно объединить их, чтобы видеть, являются ли многократные проверки всей истиной, или если один или ни одна из многих проверок не истина.

  1. Многократные проверки должны все быть истиной

    { _and: [
        { name: 'Apple' },
        { size: { '<': 20 } },
    ]}

    Примечание: Объект с многократными свойствами для соответствия будет обработан как логическое и проверок свойства.

    Примечание: _and массив требует по крайней мере двух элементов.

  2. По крайней мере одна из многих проверок является истиной

    { _or: [
        { name: 'Apple' },
        { name: { _contains: 'JavaScript' } },
    ]}

    Примечание: _or массив требует по крайней мере двух элементов.

  3. Ни одна из одной или более проверок не истина

    { _not: [
        { name: 'Apple' },
        { name: { _contains: 'JavaScript' } },
    ]}

    Примечание: _not массив может иметь один или несколько элементов.

_and, _or, и _not ключи требуют массивов как своего значения.

Вот пример, чей пункт для нахождения всех сообщений в ящике входящих сообщений, содержащих слово «JavaScript» или слово «Automation» в предмете.

Mail = Application('Mail')
Mail.inbox.messages.whose({
    _or: [
        { subject: { _contains: "JavaScript" } }
        { subject: { _contains: "Automation" } }
    ]
})

Вызов команд

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

  1. Команда без параметров

    message.open()
  2. Команда с прямым параметром

    Mail.open(message)
  3. Команда с именованными параметрами

    response = message.reply({
        replayAll: true,
        openingWindow: false
    })
  4. Команда с прямым параметром и названными параметрами

    Safari.doJavaScript('alert("Hello world")', {
        in: Safari.windows[0].tabs[0]
    })

Создание объектов

Можно создать новые объекты путем вызова конструкторов класса как функций. Дополнительно, можно передать в объекте свойств установить на недавно созданном объекте и Вас, банка может передать во втором параметре как данные, которые будут использоваться при создании нового объекта. Как только Вы сделали объект, можно или вызвать make метод на объекте или нажатии это на массив в приложении для него, чтобы быть созданным. Перед вызовом make или продвиньте на массив в приложении, объект не существует в приложении.

  1. Создание нового объекта

    message = Mail.OutgoingMessage().make()
  2. Создание нового объекта со свойствами

    message = Mail.OutgoingMessage({
        subject: 'Hello world',
        visible: true
    })
    Mail.outgoingMessages.push(message)
  3. Создание нового объекта с данными

    para = TextEdit.Paragraph({}, 'Some text')
    TextEdit.documents[0].paragraphs.push(para)

Как только объект был создан в приложении (путем вызова make или продвижение на надлежащий массив), это может взаимодействоваться с точно так же, как любой из уже существующих объектов в приложении.

message = Mail.OutgoingMessage().make()
message.subject = 'Hello world'

Примечание: Конструкторы класса являются заголовком, в корпусе.

Сценарии дополнений

Сценарии дополнений (плагины для сценариев) могут использоваться для улучшения функциональности приложений. OS имеет ряд в наличии стандартных сценариев дополнений. Эти вещи предложения как говорящий текст и диалоговые окна взаимодействия с пользователем. Для использования их приложение должно явно установить флаг includeStandardAdditions в истину.

app = Application.currentApplication()
app.includeStandardAdditions = true
app.say('Hello world')
app.displayDialog('Please enter your email address', {
    withTitle: 'Email',
    defaultAnswer: 'your_email@site.com'
})

Строгие флаги

Можно влиять, как строго JavaScript для Автоматизации обрабатывает Объекты приложения когда:

  1. Поиск свойств объектов

    app.strictPropertyScope = true

    Если Foo класс имеет свойство bar, но Baz класс не делает, следующий код только отправит надлежащее событие для получения свойства когда strictPropertyScope ложь

    app.baz[0].bar()
  2. Поиск управляет, на который отвечают объекты

    app.strictCommandScope = true

    Если приложение имеет команду foo, но Bar класс не говорит, что реагирует на ту команду, следующий код только отправит надлежащее событие команды когда strictCommandScope ложь

    app.bar[0].foo()
  3. Проверка типов параметров отправила в командах

    app.strictParameterType = true

    Например, Системные события имеет a keystroke команда, принимающая текст как его первый параметр. Приложение strictParameterType свойство должно быть ложью для Вас, чтобы быть в состоянии отправить число вместо строки.

По умолчанию приложения имеют strictPropertyScope и strictCommandScope набор ко лжи и strictParameterType набор к истине.

Тайм-аут, рассмотрение и игнорирование

Можно передать модификаторы события при получении и установке свойств, вызове команд на объектах, создании новых объектов в приложениях, и т.д. Модификаторы события должны быть переданы как последний параметр любой функции, которую Вы вызываете. Вот некоторые примеры:

  1. Вызов команды с тайм-аутом

    app = Application.currentApplication()
    app.includeStandardAdditions = true
    app.displayAlert('This will timeout in 30 seconds', { timeout: 30 })
  2. Вызов a whose регистр игнорирующего метода, но рассмотрение пробела и дефисов

    app.documents.whose({
        text: { _contains: 'custom-built automation' }
    }, {
        ignoring: 'case',
        considering: ['white space', 'hyphens']
    })

Можно рассмотреть или проигнорировать:

  1. случай

  2. diacriticals

  3. пробел

  4. дефисы

  5. пунктуация

  6. числовые строки

  7. отклики приложений

ObjectSpecifier

Объект ObjectSpecifier может привыкнуть к:

  1. Проверьте, является ли объект объектным спецификатором

    Mail.inbox.messages[0] instanceof ObjectSpecifier == true
  2. Получите класс объектного спецификатора

    Mail = Application('Mail')
    ObjectSpecifier.classOf(Mail.inbox)
  3. Создайте цепочки спецификатора произвольного объекта для использования в чей пунктах

    firstTabsName = ObjectSpecifier.tabs[0].name
    app.windows.whose({
        _match: [firstTabsName, 'Apple']
    })

Пути

Когда необходимо будет взаимодействовать с файлами, такими как документ в TextEdit, Вам будет нужен объект контуров, не только строка с путем в нем. Можно использовать конструктора Пути для инстанцирования путей.

TextEdit = Application('TextEdit')
path = Path('/Users/username/Desktop/foo.rtf')
TextEdit.open(path)

Примечание: можно получить строковое значение Пути путем вызова toString метод.

Прогресс

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

  1. Общее количество модуля

    Progress.totalUnitCount = 10
  2. Завершенное количество Модуля

    Progress.completedUnitCount = 1
  3. Описание

    Progress.description = 'Processing Files'

    Примечание: Установка описания прогресса возражает, что wil заменяют «Выполнение...» текст, появляющийся по умолчанию.

  4. Дополнительное описание

    Progress.additionalDescription = 'This may take a little while'

    Примечание: Установка дополнительного описания объекта прогресса означает общее количество модуля, и завершенное количество модуля не будет показано.

Библиотеки

Можно использовать сценарии в качестве библиотек путем хранения их в ~/Library/Script Библиотеки/.

Если у Вас есть библиотека сценария «toolbox.scpt»:

function log(message) {
    TextEdit = Application('TextEdit')
    doc = TextEdit.documents['Log.rtf']
    doc.text = message
}

сценарий может пользоваться библиотекой как это:

toolbox = Library('toolbox')
toolbox.log('Hello world')

Примечание: Когда библиотека инстанцируют, любой код за пределами функций в библиотеке будет выполняться.

Апплеты

Можно подать автономные, двойные активируемые по щелчку заявки (названный апплетами) путем записи сценария в Редакторе сценариев и сохранения его как приложения. Апплеты имеют определенный набор событий, для которых можно создать обработчики:

  1. Когда выполняется апплет:

    function run() {...}

    Примечание: Когда апплет будет выполнен, любой код за пределами функций в апплете будет выполняться.

  2. Когда апплету (капелька) говорят открыть документы (сделанный путем отбрасывания документов на апплет):

    function openDocuments(docs) {...}
  3. Когда апплету говорят распечатать документы:

    function printDocuments(docs) {...}

    Примечание: Параметром openDocuments и printDocuments обработчику будет массив строк, содержащих пути к файлам.

  4. Неактивный обработчик позволяет Вам делать периодическую обработку

    function idle() {...}
  5. Когда вновь открывается апплет:

    function reopen() {...}
  6. Когда завершен апплет:

    function quit() {...}

    Примечание: Возвращение false от обработчика выхода является единственным способом заставить апплет не выходить. Выход не из обработчика или возврат любого значения кроме лжи (включая не возврат значения) заставят апплет выходить, как это обычно было бы.

Автоматизация UI

Можно написать сценарий интерфейса приложений при помощи приложения Системных событий. Исследуйте словарь сценариев Системных событий в Редакторе сценариев (в частности Комплект Процессов) для наблюдения то, что точно может взаимодействоваться с.

Вот пример использования сценариев UI для создания нового примечания в Примечаниях:

Notes = Application('Notes')
Notes.activate()
 
delay(1)
SystemEvents = Application('System Events')
Notes = SystemEvents.processes['Notes']
 
Notes.windows[0].splitterGroups[0].groups[1].groups[0].buttons[0].click()

Мост Objective C

JavaScript для Автоматизации имеет встроенный мост Objective C, предлагающий мощную утилиту, такую как доступ к файловой системе и создавание приложений Какао.

Основные точки доступа для моста Objective C являются глобальными свойствами ObjC и $.

Платформы

Символы от платформы Основы доступны по умолчанию. Можно сделать дополнительные платформы и библиотеки доступным использованием ObjC.import() метод. С файлами BridgeSupport консультируются при импорте платформ. Например, для использования NSBeep () функция, не присутствующая в Основе, можно импортировать платформу Какао:

ObjC.import('Cocoa')
$.NSBeep()

В дополнение к системным платформам функциональность от некоторых системных библиотек была представлена и может быть импортирована путем обращения к имени заголовочного файла (без.h), который объявляет что функциональность, такая как: arpa/inet, asl, copyfile, dispatch, dyld, errno, getopt, glob, grp, ifaddrs, launch, membership, netdb, netinet/in, notify, objc, paths, pwd, readline, removefile, signal, spawn, sqlite3, stdio, stdlib, string, sys/fcntl, sys/file, sys/ioctl, sys/mount, sys/param, sys/resource, sys/socket, sys/stat, sys/sysctl, sys/time, sys/times, sys/types, sys/wait, sys/xattr, syslog, time, unistd, uuid/uuid, vImage, vecLib, vmnet, xpc, и zlib.

Помимо встроенных платформ и библиотек, можно также импортировать любую платформу, имеющую поддержку моста путем передачи полного пути платформе. Например, если у Вас есть платформа /Library/Frameworks/Awesome.framework с поддержкой моста можно сделать это:

ObjC.import('/Library/Frameworks/Awesome.framework')

Типы данных

Примитивные типы данных JavaScript отображаются на типах данных C. Например, строка JavaScript отображается на char *, в то время как целое число JavaScript отображается на int. При использовании ObjC API, возвращающего a char *, Вы получите строку JS.Примечание: Longs будет преобразован в строки в JavaScript.

Примитивные типы данных JavaScript будут автоматически преобразованы в типы объектов ObjC, когда передано как параметр методу ObjC, ожидающему тип объекта. Например, строка JS будет преобразована в NSString, если, именно это говорит сигнатура метода, параметр должен быть введен как.

Отметьте, однако, что типы объектов ObjC, возвращающиеся методами ObjC, автоматически никогда не преобразовываются в примитивные типы данных JavaScript.

Инстанцирование классов и вызов методов

Все классы определяются как свойства $ объект. Методы объектов ObjC вызываются одним из двух способов, в зависимости от того, берет ли метод параметры.

Если метод ObjC не берет параметры, то Вы вызываете его путем доступа к свойству JavaScript с тем именем. Например, это инстанцирует пустой непостоянной строки:

str = $.NSMutableString.alloc.init

Если метод ObjC действительно берет параметры, то Вы вызываете его путем вызова метода JavaScript (введенное функцией свойство) названный согласно соглашению JSExport; буква после каждого «:» капитализируется, и затем «: «s удалены. Например, это инстанцирует NSString от строки JavaScript и пишет его в файл:

str = $.NSString.alloc.initWithUTF8String('foo')
str.writeToFileAtomically('/tmp/foo', true)

Если Вы вызовете метод, такой как-intValue, возвращающий тип данных C, а не объект, то Вы возвратите примитивный тип данных JavaScript. Например, следующие возвраты примитивное целое число JavaScript, 99.

$.NSNumber.numberWithInt(99).intValue

Свойства Accessing ObjC

К свойствам ObjC также получают доступ через свойства JavaScript, подобные тому, как вызываются методы параметра меньше.

Когда к свойству соединенного мостом объекта получают доступ, со списком свойств ObjC сначала консультируются, и если свойство с тем именем существует, то надлежащий селектор метода get или метода set для того свойства используется. Если свойство ObjC с тем именем не существует на классе, то имя свойства используется в качестве селектора метода.

Если свойство определяется с помощью пользовательского имени метода get, можно использовать или имя свойства или имя метода get, и получить тот же результат:

task = $.NSTask.alloc.init
task.running == task.isRunning

Кроме того, в отличие от методов параметра меньше, соединил мостом свойства объектов, отображающиеся на свойства ObjC, может также быть установлен в (предположение, что свойство является чтением-записью). Следующие две строки эквивалентны, потому что launchPath определяется как свойство ObjC:

task.launchPath = '/bin/sleep'
task.setLaunchPath('/bin/sleep')

Обертывание и разворачивание

ObjC.wrap() метод может использоваться, преобразовывают примитивный тип данных JavaScript в тип объекта ObjC, и затем обертывают тот объект ObjC в обертку JavaScript.

ObjC.unwrap() метод может использоваться для преобразования обернутого объекта ObjC в примитивный тип данных JavaScript.

ObjC.deepUnwrap() метод может использоваться для рекурсивного преобразования обернутого объекта ObjC в примитивный тип данных JavaScript.

$() оператор является удобным псевдонимом для ObjC.wrap(), и предназначается, чтобы быть подобным @() упаковка оператора в ObjC. Например, $("foo") возвращает обернутый экземпляр NSString, и $(1) возвращает обернутый экземпляр NSNumber.

.js свойство обернутых объектов ObjC является удобным псевдонимом для ObjC.unwrap(). Например, $("foo").js возвраты «foo».

Константы и перечисления

Константы и перечисления определяются как свойства $ объект:

$.NSNotFound
$.NSFileReadNoSuchFileError
$.NSZeroRect

Функции

Функции также определяются как свойства $ объект:

$.NSBeep()
$.NSMakeSize(33, 55)

Variadics

При использовании функций и методов, принимающих variadic параметры, каждый аргумент переменной передал в, должен быть тот же тип как последний заявленный параметр. Например, printf должен получить %s параметры после строки начального формата.

ObjC.import('stdio')
$.printf('%s %s %s', 'JavaScript', 'for', 'Automation')

NSLog имеет финал, объявил тип параметра % и должен получить % параметры после строки начального формата.

$.NSLog('%@ %@ %@', $('JavaScript'), $('for'), $('Automation'))

При создании использования NSArray arrayWithObjects, нулевое завершение обрабатывается для Вас, и Вы не должны пытаться завершить его сами.

$.NSArray.arrayWithObjects($('JavaScript'), $('for'), $('Automation'))

Структуры

Структуры представлены, поскольку универсальный JavaScript возражает, где имена полей структуры являются именами свойства:

$.NSMakeRect(0, 0, 1024, 768)

Результат: {«источник»: {«x»:0, «y»:0}, «размер»: {«ширина»:1024, «высота»:768}}

Ноль

В ObjC, nil допустимая цель сообщения. Отправка сообщения к a nil объектные возвраты nil снова. Это отличается от JavaScript, не позволяющего методам быть обращенными undefined.

Для создания объекта JavaScript представляющего ноль, Вы просто вызываете функцию поля без параметров:

nil = $()

Чтобы определить, обертывает ли соединенный мостом объект фактически нулевой указатель, можно вызвать isNil () метод:

if (o.isNil()) { ... }

Неявная передача ссылкой

Это упаковало nil может быть передан как параметр методу ObjC, ожидающему параметр, переданный ссылкой; время выполнения волшебно заменит внутреннее nil указатель с указателем, возвращенным ссылкой.

error = $()
fm = $.NSFileManager.defaultManager
fm.attributesOfItemAtPathError('/DOES_NOT_EXIST', error)
if (error.code == $.NSFileReadNoSuchFileError) {
    // ...
}

Явная передача ссылкой

Касательно класса может использоваться для передачи параметров, что ObjC ожидает быть переданным ссылкой. Значение, на которое ссылаются, может быть получено путем доступа '0' свойство Касательно.

function testExplicitPassByReference(path) {
    ref = Ref()
    fm = $.NSFileManager.defaultManager
    exists = fm.fileExistsAtPathIsDirectory(path, ref)
    if (exists) {
        isDirectory = ref[0]
        return (path + ' is ' + (isDirectory ? '' : 'not ') + 'a directory; ')
    }
    else {
        return (path + ' does not exist\n')
    }
}
 
output = testExplicitPassByReference('/System')
       + testExplicitPassByReference('/mach_kernel')
       + testExplicitPassByReference('/foo')

Результат: / Система каталог;/mach_kernel не является каталогом;/foo не существует

Касательно

Для доступа к значениям байта Касательно объектов они могут быть индексированы в подобные массивы:

ref = Ref('id*')
ref[0] = $('foo')
if (ref[0] == $('foo')) { ... }

Когда необходимо передать непрозрачный указатель и проверить, вернули ли Вы тот непрозрачный указатель, Вы инстанцируете недействительного Касательно и используете equals метод. Например:

CONTEXT = Ref('void')
 
ObjC.registerSubclass({
    name: 'MyObject',
    properties: { foo: 'id' },
    methods: {
        'startObserving': {
            types: ['void', []],
            implementation: function (obj) {
                this.addObserverForKeyPathOptionsContext(
                    this,
                    'foo',
                    ($.NSKeyValueObservingOptionNew | $.NSKeyValueObservingOptionOld),
                    CONTEXT
                );
            },
        },
        'observeValueForKeyPath:ofObject:change:context:': {
            types: ['void', ['id', 'id', 'id', 'void *']],
            implementation: function(keyPath, observedObject, change, context) {
                $.NSLog(Automation.getDisplayString(Ref.equals(context, CONTEXT)))
            }
        }
    }
})

Функциональная привязка

Когда платформы импортируются, только функции C, указанные в файлах BridgeSupport, сделаны доступными. Для доступа к другим функциям C, соединяющимся в хост-приложение сценарий может связать их в среду JavaScript. Для этого необходимо указать возврат и типы аргумента функции:

ObjC.bindFunction('pow', ['double', ['double', 'double']])
$.pow(2,10)

Результат: 1024

Типы

Вот некоторые позволенные строки для указания типов свойств, и аргументов метода и аргументов функции и возвращаемых значений: void, bool, float, double, unsigned char, char, unsigned short, short, unsigned int, int, unsigned long, long, long double, class, selector, string, pointer, block, function, и id.

Примечание: Имена типов структуры, такой как NSRect, позволяются, но id должен использоваться для объектов, не фактических имен классов.

Разделение на подклассы

Подклассы объектов Objective C могут быть зарегистрированы от JavaScript:

ObjC.registerSubclass({
    name: 'AppDelegate',
    superclass: 'NSObject',
    protocols: ['NSApplicationDelegate'],
    properties: {
        window: 'id'
    },
    methods: {
        'applicationDidFinishLaunching:': function (notification) {
            $.NSLog('Application finished launching');
        }
    }
})

Если никакой суперкласс не будет дан, то объект неявно разделит NSObject на подклассы. При переопределении метода указание, что типы методов являются дополнительными, но если типы присутствуют, они должны соответствовать те из метода суперкласса.

Вот пример пользовательского init метода и пользовательского метода с его объявленными типами:

ObjC.registerSubclass({
    name: 'MyClass',
    properties: {
        foo: 'id'
    },
    methods: {
        init: function () {
            var _this = ObjC.super(this).init;
            if (_this != undefined) {
                _this.foo = 'bar'
            }
            return _this
        },
        baz: {
            types: ['void', []],
            implementation: function () {
                this.foo = 'quux'
            }
        }
    }
})

Примечание: НЕ присваивайтесь к this переменная или любое из ее свойств в init методах. Присвойтесь к различной переменной (_this используется выше), используйте ту переменную, чтобы инициализировать свойства, и затем возвратить ее. Во всех других методах, стандарте this переменная должна использоваться. В JavaScript Нельзя повторно присвоиться this переменная. Классам Objective C позволяют возвратить из их init методов различный объект, чем это, на котором вызвали метод.

Automation.getDisplayString ()

Automation объект имеет a getDisplayString метод, позволяющий Вам передавать в объекте и распечатывать его как исходный текст или человекочитаемую строку дисплея

foo = $('bar')
Automation.getDisplayString(foo)

Передача в true как второй параметр к getDisplayString распечатает объект как строку дисплея вместо исходного текста.

Automation.getDisplayString(foo, true)