ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
外部机制(第6.2节)提供以类型安全的方式对原生APIs的访问 。它假设定义的类型在运行时存在,但是不假设如何和哪里定义那些类型。 外部类的一个例子是 Haxe 标准库的 JQuery 类 。为了说明,这里有一个简化版的外部类: ~~~ package js.jquery; @:native("$") extern class JQuery { /** Creates DOM elements on the fly from the provided string of raw HTML. OR Accepts a string containing a CSS selector which is then used to match a set of elements. OR Binds a function to be executed when the DOM has finished loading. **/ @:selfCall @:overload(function(element:js.html.Element):Void { }) @:overload(function(selection:js.jquery.JQuery):Void { }) @:overload(function(callback:haxe.Constraints.Function):Void { }) @:overload(function(selector:String, ?context:haxe.extern.EitherType<js.html.Element, js.jquery.JQuery>):Void { }) public function new():Void; /** Adds the specified class(es) to each element in the set of matched elements. **/ @:overload(function(_function:Int -> String -> String):js.jquery.JQuery { }) public function addClass(className:String):js.jquery.JQuery; /** Get the HTML contents of the first element in the set of matched elements. OR Set the HTML contents of each element in the set of matched elements. **/ @:overload(function(htmlString:String):js.jquery.JQuery { }) @:overload(function(_function:Int -> String -> String):js.jquery.JQuery { }) public function html():String; } ~~~ 注意,函数可以被重载以接受不同类型的参数和返回值,使用 @:overload 元数据。函数重载只用于 外部类中。 使用这个外部类,我们可以这样使用 jQuery : ~~~ import js.jquery.*; .. new JQuery("#my-div").addClass("brand-success").html("haxe is great!"); .. ~~~ 外部类的包和类名应该和在外部类库中定义的相同。如果不是这种情况,使用 @:native 重写类的路径。 ~~~ package my.application.media; @:native('external.library.media.video') extern class Video { .. ~~~ 一些JavaScript库青睐实例化的类,不使用 new 关键字。要防止 Haxe 编译器在使用一个类时输出 new 关键字,我们可以附加一个 @:selfCall 元数据到它的构造函数。例如,当我们实例化 上面的jQuery外部类时,new JQuery() 被输出,而不是 new $() 。 @:selfCall元数据也可被附加到一个方法。这种情况,方法会被理解为一个直接对该对象的调用,说明如下: ~~~ extern class Functor { public function new():Void; @:selfCall function call():Void; } class Test { static function main() { var f = new Functor(); f.call(); // will be outputted as `f();` } } ~~~ 除了外部类之外,Typedefs(第3.1节)可以是另一个很好的方式来命名(或别名)一个 JavaScript 类型。typedefs 和 外部类之间主要的不同是,typedefs 是绕开类型的,而外部类不是。Typedefs 适用于一般的数据结构,例如 point({x:Float, y:Float}) 。对函数参数使用一个 typedef 的 point 结构,允许外部的JavaScript 函数接受来自Haxe或者其它JavaScript库的 point 类实例。也可以用于类型化 JSON 对象。 Haxe标准库带有jQuery 和SWFObject的外部类。它们的版本兼容性概括如下: |Haxe 版本|库|外部位置| | -- | -- | -- | |3.3| jQuery 1.11.3 / 2.1.4 | js.jquery.* | |3.2-| jQuery 1.6.4 |js.JQuery | |3.3|SWFObject 2.3| js.swfobject.* | |3.2- | SWFObject 1.5 |js.SWFObject | 对于其它流行的原生库,在Haxelib库(第11章)中有许多可用的外部类。要查看它们的列表,查看 extern 标签。