ADN Open CIS
Сообщество программистов Autodesk в СНГ

14/11/2015

Особенности, характерные для JavaScript - Часть 2

Ссылочные аргументы

JavaScript не поддерживает идею вывода или аргументов "по ссылке". Например, метод Point2D.getData документирован как:

boolean Point2D.getData( out double x, out double y

Аргументы x и у типа "out double", где "out" указывает "ссылочный аргумент".Документация указывает, что этот аргумент будет использоваться в качестве аргумента, содержащего выходной результат.

Конвенция, используемая для обработки аргументов "по ссылке" в версии JavaScript API, должна ожидать переменную, которая устанавливается с объектом. Значение ввода и/или вывода будет установлено в значение в этом объекте с ключевым названием "value". Например, вызов Point2D.getData будет сделан с помощью следующего кода.

Код - JavaScript: [Выделить]
  1. // Передать пустые объекты чтобы получить ссылочные значения.
  2. var xVal = {}, yVal = {};
  3. if (point.getData(xVal, yVal)) {
  4.     // xVal.value и yVal.value теперь содержат результирующие значения Number.
  5.                 var x = xVal.value;
  6.                 var y = yVal.value;
  7.     console.log(x + ', ' + y);
  8. }

Типы объектов

JavaScript не является жестким и сильно типизированным объектным языком. Объекты являются более динамичными. Объекты API использует прототипную модель наследования, так что вы можете использовать оператор InstanceOf для запроса типа объекта. Например, следующий код может быть использован для определения, является ли тип выбранного объекта BRepFace.

Код - JavaScript: [Выделить]
  1. var entity = selection.object;
  2. if (entity instanceof adsk.fusion.BRepFace) {
  3. // 'entity' - это BRepFace. Вызовите члены BRepFace здесь.
  4. var surface = entity.geometry;}

Потому что переменные JavaScript не имеют типа, подсказки кода в редакторе исходного кода, такого как Brackets, должны делать предположения на основе контекста, из которого была получена переменная. В приведенном выше примере, переменная "entity" была получена из свойства adsk.core.Selection.object, которое определено для возвращения объекта типа adsk.core.Base. Из-за этого, подсказки кода по переменной "entity" во время разработки будут очень скупыми. При вводе "entity." выше, вы получите только подсказки кода для типа adsk.core.BRepFace, а не значения из типа adsk.fusion.BRepFace. В качестве альтернативы использованию непосредственно 'InstanceOf', конструктор функции для различных типов API может быть использован в качестве оператора "casting". Например, образец кода выше, может быть переписан в виде:

Код - JavaScript: [Выделить]
  1. var face = adsk.fusion.BRepFace(selection.object);
  2. if (face) {
  3. // Вызовите члены BRepFace здесь.
  4. var surface = face.geometry;}

Вызов функции конструктора adsk.fusion.BRepFaceв этом случае будет осуществляться с кодом примерно эквивалентным "return object instanceof adsk.core.BRepFace ? object : null;". Если аргумент, переданный в функцию конструктора является экземпляром этой функции конструктора, он просто возвращает этот объект, иначе это возвращает "null". Это делает две вещи. Во-первых, дает возможность сделать проверку типа. Вы можете проверить возвращаемое значение для null (либо "ложности"), чтобы определить, если он этого типа. Во-вторых, поскольку эти функции конструктора, как известно, возвращают экземпляр этого типа, то подсказки кода будут для данного типа экземпляра. Таким образом, в примере кода выше, при вводе "face.", вы должны получить надлежащие подсказки кода для типа adsk.fusion.BRepFace, как и ожидалось. В то время как не нужно использовать эти функции приведения, они могут быть удобны в использовании.

Равенство объектов

Оно является общим при необходимости сравнить два объекта, или переменные указывают на тот же объект. В JavaScript, две переменные будут считаться эквивалентными ('==' или '==='), если обе переменные ссылаются на один и тот же экземпляр одного объекта.

Код - JavaScript: [Выделить]
  1. var object1 = {};
  2. var object2 = {};
  3. var object3 = object1;
  4. object1 === object2; // false
  5. object1 === object3; // true

Каждая функция API, который возвращает объект API, создает новый экземпляр объекта обертки JavaScript и не пытается поддерживать уникальную ссылку на объект. Таким образом, простая проверка равенства двух объектов API, полученных из двух разных вызовов API вернет false при использовании операторов '==' или '' ===.Функция "equals" была добавлена для всех объектов API JavaScript для использования при сравнении, ссылаются ли два экземпляра объекта API на один и тот же объект в Fusion.

Код - JavaScript: [Выделить]
  1. var plane1 = component.constructionPlanes.item(0);
  2. var plane2 = component.constructionPlanes.item(0);
  3. plane1 === plane2; // false
  4. plane1.equals(plane2); // true

События

Шаблон события, используемый API состоит из объекта Event, который является источником событий. Вы, как правило, реализовать свой собственный, полученный из EventHandler, и создать экземпляр обработчика событий, которые вы затем добавляете и удаляете из исходного объекта Event. Когда событие срабатывает, будет вызван метод "notify" обработчика событий. В API JavaScript, эта модель была изменена, чтобы устранить необходимость в производном пользовательском классе EventHandler. Вместо этого, ссылка на функцию, для вызова когда событие срабатывает, могут быть переданы непосредственно в методы "add" и "remove" объекта Event.

Код - JavaScript: [Выделить]
  1. var onCommandExecuted = function(args) {
  2.     // Здесь располагается код обработки событий
  3. };
  4. ...
  5. command.commandCreated.add(onCommandCreated);

Источник: http://help.autodesk.com/view/NINVFUS/ENU/?guid=GUID-C081FA71-4541-4CA5-AA08-7343EF6701B4

Автор перевода: Дмитрий Емельянов

Обсуждение: http://adn-cis.org/forum/index.php?topic=3202

Опубликовано 14.11.2015