是否可以使用Dart中的数组表示法访问js.context之后的所有对象?例如,我想将以下代码转换为使用数组表示法:
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);发布于 2013-06-26 14:31:40
TL;DR:从r24278开始,属性使用数组表示法,方法使用noSuchMethod。
使用js.context['gapi']['client']可以得到与js.context.gapi.client相同的结果。数组表示法的主要优点是它避免了noSuchMethod。直到最近,它还是解决issue in dart2js where minified does not work with noSuchMethod问题的唯一方法。此问题已修复,缩小应与Dart-JS互操作一起使用。
前几次我做了一些基准测试:
用于属性访问的
noSuchMethod快10%左右。( js.context.x与js.context['x'] )用于方法访问的noSuchMethod慢大约50%。( js.context.f()与js.context['f']() )最后一个结果由js.context['f']()的JS和Dart之间的两次通信来解释。一个用于检索函数引用( js.context['f'] ),另一个用于调用此函数。
最后要注意的是,使用noSuchMethod可能会增加dart2js结果的大小(但在我测试过的地方不会太大)。
发布于 2013-06-26 13:51:56
这对我来说很有效:
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
https://stackoverflow.com/questions/17312088
复制相似问题