NativeScript - 使用 JavaScript 的本机 API

本节介绍使用 JavaScript 访问本机 API 的概述。

编组

NativeScript 运行时为 Android 和 iOS 平台提供隐式类型转换。此概念称为编组。例如,NativeScript-iOS 平台可以类似地隐式转换 JavaScript 和 Objective-C 数据类型,Java/Kotlin 可以轻松映射到 JavaScript 项目类型和值。让我们简要了解如何逐一执行每种类型的编组。

数字值

我们可以轻松地将 iOS 和 Android 数字数据类型转换为 JavaScript 数字。iOS 到 JavaScript 的简单数字转换定义如下 −

console.log(`max(7,9) = ${max(7,9)}`);

这里,

原生的 max() 函数被转换成 JavaScript 数字。

Android 环境

Java 支持不同的数字类型,如字节、短整型、整型、浮点型、双精度型和长整型。JavaScript 只有数字类型。

考虑下面显示的一个简单的 Java 类 −

class Demo extends java.lang.Object {
   public int maxMethod(int a,int b) {
      if(a>b) {
         return a;
      } else {
         return b;
      }
   }
}

这里,

上面的代码包含两个整数参数。我们可以使用 JavaScript 调用上述代码对象,如下所示 −

//为 Demo 类创建一个实例
var obj = new Demo();

//调用上述方法的隐式整数转换
obj.maxMethod(7,9);

字符串

Android 字符串在 java.lang.string 中定义,iOS 字符串在 NSSring 中定义。让我们看看如何在两个平台上执行编组。

Android

字符串是不可变的,但字符串缓冲区支持可变字符串。

以下代码是简单映射 − 的示例

//创建 android 标签小部件
var label = new android.widget.Label();

//创建 JavaScript 字符串
var str = "Label1";

//将 JavaScript 字符串转换为 java label.setText(str);
//文本转换为 java.lang.String

Boolean 类在 java.lang.Boolean 中定义。此类将布尔值包装在对象中。我们可以轻松地将布尔值转换为字符串,反之亦然。简单示例定义如下 −

//创建 java 字符串
let data = new java.lang.String('NativeScript');

//将 java 字符串映射到 JavaScript 字符串,
let result = data.startsWith('N');

//返回结果
console.log(result);// true

iOS 环境

NSString 类是不可变的,但其子类 NSMutableString 是不可变的。此类包含用于处理字符串的方法集合。其声明如下 −

class NSString : NSObject

考虑一个简单的 objective-c 声明,如下所示 −

NSString *str = @"nativescript";
//将字符串转换为大写
NSString *str1;
str1 = [str uppercaseString];
NSLog(@"Uppercase String : %@
", str1 );

NSStrings 可以轻松映射到 JavaScript 字符串。

数组

本节介绍如何在数组中执行编组。让我们首先以 iOS 环境为例。

数组声明

class NSArray : NSObject

这里,

NSArray 用于管理称为数组的有序对象集合。它用于创建静态数组。其子类NSMutableArray用于创建动态数组。

考虑使用数组文字创建 NSArray 对象,如下所示 −

let array: NSArray = ["React","Vue","TypeScript"]

现在,我们可以将此数组映射到 JavaScript,如下所示 −

//创建本机数组
let nsArr = NSArray.arrayWithArray("React","Vue","TypeScript"]);

//创建简单的 javascript 数组
let jsArr = ["Hello,World","NativeScript"];

//现在比较两个数组,
let compare = nsArr.isEqual(jsArr);
console.log(comapre);

这将返回 false 的输出。

Android 数组声明

Java 数组在 java.util.Arrays 中定义。此类包含用于操作数组的各种方法。下面显示了一个示例 −

//javascript 数组
let data = [12,45,23,56,34,78,50];

//创建 java 数组
let result = ns.example.Math.maxElement(data);
console.log(result);

类和对象

类和对象是面向对象编程的基本概念。类是用户定义的原型。对象是类的一个实例。类表示一组属性或方法,这些属性或方法对于一种类型的所有对象都是通用的。让我们了解两种移动开发环境的本机类和对象。

Android 环境

Java 和 Kotlin 类具有由完整包名称表示的唯一标识符。

例如,

android.view.View −它是一个用于屏幕布局和与用户交互的基本用户界面类。我们可以在 JavaScript 中访问此类,如下所示 −

const View = android.view.View;

首先,我们使用以下语句导入该类 −

import android.view.View;

接下来创建一个如下所示的类 −

public class MyClass {
   public static void staticMethod(context) {
      //创建视图实例
      android.view.View myview = new android.view.View(context);
   }
}

在上述同一个类中,我们可以使用以下代码 − 访问 JavaScript 函数

const myview = new android.view.View(context);

类似地,我们可以访问 java.lang 包内的接口、常量和枚举。

iOS 环境

Objective-C 类在两个部分 @interface 和 @implementation 中定义。类定义以关键字 @interface 开头,后跟 interface(class) 名称。在 Objective-C 中,所有类都从名为 NSObject 的基类派生而来。

它是所有 Objective-C 类的超类。简单的 Circle 类定义如下所示−

@interface Circle:NSObject {
   //实例变量
   int radius;
}
@end

考虑一个具有一个方法的类,如下所示 −

@interface MyClass : NSObject
+ (void)baseStaticMethod;
@end

可以使用以下代码将此类转换为 javascript −

function MyClass() { /* 本机调用 */};
Object.setPrototypeOf(MyClass, NSObject);
BaseClass.baseStaticMethod = function () { /* 本机调用 */};

JavaScript instanceof 运算符用于验证对象是否从给定类继承。这可以定义为 −

var obj = MyClass.alloc().init(); // 对象创建
console.log(obj instanceof NSObject); //返回 true

此处,

Objective-C 实例使用 alloc、init 或 new 方法创建。在上面的示例中,我们可以使用 new 方法轻松创建对象初始化,如下所示 −

var obj = MyClass.new();

同样,您可以访问静态方法和属性。