我想在通过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函数的存在?
答案 0 :(得分:2)
使用hasOwnProperty()
来自Object的每个对象都继承hasOwnProperty方法。此方法可用于确定对象是否具有指定的属性作为该对象的直接属性;与in运算符不同,此方法不会检查对象的原型链。
来自MDN webdocs Object.prototype.hasOwnProperty()