2013-06-26 83 views
1

可以使用来自Dart的数组表示法访问js.context之后的所有对象吗?例如,我想将以下内容转换为数组表示法:使用数组符号而不是NSM对函数更深,然后js.context.X

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

TL; DR:启动从r24278使用数组符号亲perties和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.xjs.context['x']
  • 对于方法访问:数组表示法比noSuchMethod慢50%左右。 (js.context.f()js.context['f']()

这最后的结果是由2个通信JS达特之间为js.context['f']()说明。一个检索函数引用(js.context['f'])和其他调用此函数。

末关注,使用noSuchMethod可以增加你的dart2js结果的大小(但没有这么多,我已经测试过)。

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

相关问题