2013-06-26 88 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

相關問題