Особенности, характерные для JavaScript - Часть 2
Ссылочные аргументы
JavaScript не поддерживает идею вывода или аргументов "по ссылке". Например, метод Point2D.getData документирован как:
Аргументы x и у типа "out double", где "out" указывает "ссылочный аргумент".Документация указывает, что этот аргумент будет использоваться в качестве аргумента, содержащего выходной результат.
Конвенция, используемая для обработки аргументов "по ссылке" в версии JavaScript API, должна ожидать переменную, которая устанавливается с объектом. Значение ввода и/или вывода будет установлено в значение в этом объекте с ключевым названием "value". Например, вызов Point2D.getData будет сделан с помощью следующего кода.
- // Передать пустые объекты чтобы получить ссылочные значения.
- var xVal = {}, yVal = {};
- if (point.getData(xVal, yVal)) {
- // xVal.value и yVal.value теперь содержат результирующие значения Number.
- var x = xVal.value;
- var y = yVal.value;
- console.log(x + ', ' + y);
- }
Типы объектов
JavaScript не является жестким и сильно типизированным объектным языком. Объекты являются более динамичными. Объекты API использует прототипную модель наследования, так что вы можете использовать оператор InstanceOf для запроса типа объекта. Например, следующий код может быть использован для определения, является ли тип выбранного объекта BRepFace.
- var entity = selection.object;
- if (entity instanceof adsk.fusion.BRepFace) {
- // 'entity' - это BRepFace. Вызовите члены BRepFace здесь.
- 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". Например, образец кода выше, может быть переписан в виде:
- var face = adsk.fusion.BRepFace(selection.object);
- if (face) {
- // Вызовите члены BRepFace здесь.
- var surface = face.geometry;}
Вызов функции конструктора adsk.fusion.BRepFaceв этом случае будет осуществляться с кодом примерно эквивалентным "return object instanceof adsk.core.BRepFace ? object : null;". Если аргумент, переданный в функцию конструктора является экземпляром этой функции конструктора, он просто возвращает этот объект, иначе это возвращает "null". Это делает две вещи. Во-первых, дает возможность сделать проверку типа. Вы можете проверить возвращаемое значение для null (либо "ложности"), чтобы определить, если он этого типа. Во-вторых, поскольку эти функции конструктора, как известно, возвращают экземпляр этого типа, то подсказки кода будут для данного типа экземпляра. Таким образом, в примере кода выше, при вводе "face.", вы должны получить надлежащие подсказки кода для типа adsk.fusion.BRepFace, как и ожидалось. В то время как не нужно использовать эти функции приведения, они могут быть удобны в использовании.
Равенство объектов
Оно является общим при необходимости сравнить два объекта, или переменные указывают на тот же объект. В JavaScript, две переменные будут считаться эквивалентными ('==' или '==='), если обе переменные ссылаются на один и тот же экземпляр одного объекта.
- var object1 = {};
- var object2 = {};
- var object3 = object1;
- object1 === object2; // false
- object1 === object3; // true
Каждая функция API, который возвращает объект API, создает новый экземпляр объекта обертки JavaScript и не пытается поддерживать уникальную ссылку на объект. Таким образом, простая проверка равенства двух объектов API, полученных из двух разных вызовов API вернет false при использовании операторов '==' или '' ===.Функция "equals" была добавлена для всех объектов API JavaScript для использования при сравнении, ссылаются ли два экземпляра объекта API на один и тот же объект в Fusion.
- var plane1 = component.constructionPlanes.item(0);
- var plane2 = component.constructionPlanes.item(0);
- plane1 === plane2; // false
- plane1.equals(plane2); // true
События
Шаблон события, используемый API состоит из объекта Event, который является источником событий. Вы, как правило, реализовать свой собственный, полученный из EventHandler, и создать экземпляр обработчика событий, которые вы затем добавляете и удаляете из исходного объекта Event. Когда событие срабатывает, будет вызван метод "notify" обработчика событий. В API JavaScript, эта модель была изменена, чтобы устранить необходимость в производном пользовательском классе EventHandler. Вместо этого, ссылка на функцию, для вызова когда событие срабатывает, могут быть переданы непосредственно в методы "add" и "remove" объекта Event.
- var onCommandExecuted = function(args) {
- // Здесь располагается код обработки событий
- };
- ...
- 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