2

有什么区别:

context["recentlyUsedStations"] = ["Goetheplatz", "Marienplatz"];

context["recentlyUsedStations"] = new JsObject.jsify(["Goetheplatz", "Marienplatz"]);

我在 chrome 扩展背景页面上使用它,并且在这两种情况下都能够在弹出页面中获取值。如果我尝试更改列表,则第一种情况会生成一个整数数组(值 0)。第二种情况正常。

4

1 回答 1

3

第一个版本定义了一个 js 变量recentlyUsedStations,其值设置为包含对Dart 对象DartObject的引用的 js 对象。["Goetheplatz", "Marienplatz"]从 Js 方面来看,这个变量几乎是不可用的,只能用于保持对 Dart 对象的引用。这样可以通过调用来检索 Dart 对象context["recentlyUsedStations"]

没有 new js.JsObject.jsify(...)

final a = ['b', 'c'];
js.context['a'] = a;

// unusable wrapper on Js side
// display : [object DartObject]
js.context['console'].callMethod('log', [js.context['a']]);

// the reference is kept
// display : true
print(identical(a, js.context['a']));

第二个版本定义了一个 js 变量recentlyUsedStations,其值设置为一个 js 对象,该对象是通过转换["Goetheplatz", "Marienplatz"]为等效的 js 数组而创建的["Goetheplatz", "Marienplatz"]。这样数据可以在 Js 端使用,但它忘记了原始 Dart 对象上的引用。所以在dart List中添加一个元素对Js端的数组是没有影响的。

new js.JsObject.jsify(...)

final a = ['b', 'c'];
js.context['a'] = new js.JsObject.jsify(a);

// converted to an array on Js side
// display : [b,c]
js.context['console'].callMethod('log', [js.context['a']]);

// the reference has been forgotten
// display : false
print(identical(a, js.context['a']));

// adding an element on the original List has no effect on Js value
a.add('d');
js.context['console'].callMethod('log', [js.context['a']]); // b,c
于 2014-01-17T20:55:34.863 回答