如何从Dart检查JavaScript函数的存在

时间:2018-02-13 09:33:59

标签: javascript dart interop

我想在通过JS互操作调用它之前检查Dart是否存在顶级JavaScript函数。我认为暴露Ariticle.i18n.join_translations JS操作符会有所帮助,但无法使其工作。

我尝试过的事情。

使用typeof

package:js

调用@JS() library existence_check; import 'package:js/js.dart'; @JS() external void someJsFunction(String input); @JS() external String typeof(object); String check() => typeof(someJsFunction); 会给我以下异常(在Chrome中测试):

check()

使用NoSuchMethodError: method not found: 'typeof' (self.typeof is not a function)

dart:js

我得到例外:

import 'dart:js'; String check() => context.callMethod('typeof', [42]);

NullError: method not found: 'apply' on null块中包装互操作函数:

try-catch

我认为前两种方法不起作用,因为@JS() external void someJsFunction(String input); try { someJsFunction('hi'); } on NoSuchMethodError { // someJsFunction does not exist as a top level function } catch(e) { if (e.toString() == 'property is not a function') { // We are in Dartium and someJsFunction does not exist as a top level function } else { rethrow; } } 不是一个函数,而是一个运算符。第三种方法有效,但请注意我必须根据当前浏览器准备不同的异常。而且我不确定它是否适用于所有平台,所有浏览器。

在调用之前有没有更好的方法来检查JS函数的存在?

1 个答案:

答案 0 :(得分:2)

使用hasOwnProperty()

  

来自Object的每个对象都继承hasOwnProperty方法。此方法可用于确定对象是否具有指定的属性作为该对象的直接属性;与in运算符不同,此方法不会检查对象的原型链。

来自MDN webdocs Object.prototype.hasOwnProperty()