过去的 JS 互操作
本页介绍 Dart 以前的 JS 互操作迭代,这些迭代被认为是遗留的。它们尚未被弃用,但将来可能会被弃用。因此,请优先使用 dart:js_interop
,并在可能的情况下迁移旧互操作库的用法。虽然 dart:html
和其他 Web 库密切相关,但它们在 package:web
页面中介绍。
dart:js
#dart:js
公开了一个具体的 对象包装器
来与 JS 对象互操作。此包装器包含基于字符串的方法,用于动态获取、设置和调用包装的 JS 对象上的属性。由于包装成本,它的性能较低,并且在人体工程学上更难以使用。例如,您没有代码补全功能,因为您无法声明互操作成员,而是依赖于字符串。dart:js
中公开的许多功能(如 allowInterop
)后来通过其他互操作库重新公开。
自从发布 package:js
和 dart:js_util
以来,该库一直处于遗留状态。它很可能是第一个被弃用的。
package:js
#package:js
引入了声明互操作类型和成员的功能。它允许用户编写互操作类而不是互操作扩展类型。在运行时,这些类被擦除为类似于 dart:js_interop
的 JSObject
的类型。
@JS()
class JSType {}
package:js
的用户会发现 dart:js_interop
的语法和语义很熟悉。您可以通过将类定义替换为扩展类型来迁移到 dart:js_interop
,并且在许多情况下它可以正常工作。
但是,存在显着差异
package:js
类型不能用于与浏览器 API 互操作。dart:js_interop
类型可以。package:js
允许动态分派。这意味着,如果您将package:js
类型强制转换为dynamic
并在其上调用互操作成员,它将转发到正确的成员。这在dart:js_interop
中不再可能。package:js
的@JS
没有健全性保证,因为未检查external
成员的返回类型。dart:js_interop
是健全的。package:js
类型无法重命名实例成员或拥有非external
成员。package:js
类型可以子类型化并成为非互操作类的超类型。这通常用于模拟。使用dart:js_interop
,模拟是通过替换 JS 对象来完成的。请参阅模拟教程。@anonymous
类型是一种声明具有对象字面量构造函数的互操作类型的方法。dart:js_interop
不以这种方式区分类型,并且任何external
命名参数构造函数都是对象字面量构造函数。
@staticInterop
#除了 @JS
和 @anonymous
之外,package:js
后来公开了 @staticInterop
,它是互操作扩展类型的原型。它与 dart:js_interop
一样具有表现力且限制性,并且旨在作为扩展类型可用之前的过渡语法。
@staticInterop
类型被隐式擦除为 JSObject
。它要求用户在扩展中声明所有实例成员,以便只能使用静态语义,并且具有更强的健全性保证。用户可以使用它与浏览器 API 交互,它还允许重命名和非 external
成员等操作。与互操作扩展类型一样,它不支持动态分派。
几乎总是可以通过将类更改为扩展类型并删除注解来将 @staticInterop
类迁移到互操作扩展类型。
dart:js_interop
公开了 @staticInterop
(以及 @anonymous
,但仅当也使用 @staticInterop
时),以支持静态互操作语义,直到将扩展类型添加到该语言中。现在应将所有此类类型迁移到扩展类型。
dart:js_util
#dart:js_util
提供了一些无法在 package:js
类型中声明或对于值的来回传递所必需的实用程序函数。这包括以下成员:
allowInterop
(现在是Function.toJS
)getProperty
/setProperty
/callMethod
/callConstructor
(现在位于dart:js_interop_unsafe
中)- 各种 JS 运算符
- 类型检查助手
- 模拟支持
- 等等。
dart:js_interop
和 dart:js_interop_unsafe
现在包含这些助手,可能具有替代语法。
除非另有说明,本网站上的文档反映了 Dart 3.6.0。页面上次更新于 2024-11-27。 查看源代码 或 报告问题。