1

js.context可以使用 Dart 中的数组表示法访问之后的所有对象吗?例如,我想将以下内容转换为使用数组表示法:

var request = js.context.gapi.client.request(js.map(requestData));

以下数组表示法会起作用吗?

var request = js.context['gapi']['client']['request'](js.map(requestData));

另外,如果尝试访问 JavaScript 内置方法,是否应该执行以下操作?

js.context['JSON']['stringify'](jsonResp);
4

2 回答 2

4

TL;DR:从r24278开始,对属性和方法使用数组表示noSuchMethod法。


使用js.context['gapi']['client']给出与 相同的结果js.context.gapi.client。数组表示法的主要优点是它避免了noSuchMethod. 直到最近,它还是解决 dart2js 中的一个问题的唯一方法,在该问题中,minified 不适用于 noSuchMethod。此问题已修复,并且缩小应该与 Dart-JS 互操作一起使用。

前段时间我做了一个小基准测试:

  • 对于属性访问:数组表示法比 . 快 10% 左右noSuchMethod。(js.context.xjs.context['x']
  • 对于方法访问:数组表示法比 . 慢 50% 左右noSuchMethod。(js.context.f()js.context['f']()

最后一个结果可以通过JSDart之间的 2 次通信来解释js.context['f']()。一个用于检索函数引用 ( js.context['f']),另一个用于调用此函数。

最后一个问题,使用noSuchMethod可以增加你的 dart2js 结果大小(但在我测试过的地方并没有那么多)。

于 2013-06-26T06:31:39.807 回答
1

这对我有用:

  var hug = new js.Proxy(context['Hug']);

  var hugDatabase = new js.Proxy(context['HugDatabase']);

  hugDatabase['addHug'](hug);

  print(hugDatabase['hugs']['length']);

它与这个 JavaScript 交互:

function Hug(strength) {
  this.strength = strength;
}

Hug.prototype.embrace = function(length) {
  return 'Thanks, that was a good hug for ' + length + ' minutes!';
}

Hug.prototype.patBack = function(onDone) {
  onDone('All done.');
}

function HugDatabase() {
  this.hugs = [];
}

HugDatabase.prototype.addHug = function(hug) {
  this.hugs.push(hug);
}

完整示例在这里:https ://github.com/sethladd/dart-example-js-interop/blob/master/web/dart_js_interop_example.dart

于 2013-06-26T05:51:56.267 回答