JSCore/V 8環境でJavaScriptのConsolie機能を実現
9403 ワード
JavaScript原生の中ではデフォルトではConsolieオブジェクトがありません.これは宿主のオブジェクトが提供する内蔵オブジェクトです.webviewに内蔵されていますが、JSCoreのようなJSエンジンでは機能が実現されていませんので、フロントエンドのデバッグが便利で、コードの移植性もありますので、手動で実現する必要があります.大体の実現構想は以下の通りです.
グローバルに注ぎ込むログ印刷関数
全体的なログ印刷関数を注入して、名前を
iOS JSContextの例
可変パラメータ
JavaScriptの方法には、
javascriptコード
NativePrintメソッドを注入した後、グローバルなCosolieオブジェクトを注入します.例えば、
グローバルに注ぎ込むログ印刷関数
全体的なログ印刷関数を注入して、名前を
NativePrint
と仮定して、その後、Consoneオブジェクトを作成し、Cosoneオブジェクトのログ出力を全部このNativePrint
に転送します.NativePrint
は、二つのパラメータを受信し、一つはログタイプ、一つはログ内容である.iOS JSContextの例
JSContext * context = [JSContext new];
context[@"NativePrint"] = ^(NSString *logType , id logContext) {
//
}
Android V 8の例import com.eclipsesource.v8.V8;
JavaVoidCallback callback = new JavaVoidCallback() {
@Override
public void invoke(final V8Object receiver, final V8Array parameters) {
// parameters ,
}
}
V8 runtime = V8.createV8Runtime();
runtime.registerJavaMethod(callback, "NativePrint");
ソリッドオブジェクトを注入する可変パラメータ
JavaScriptの方法には、
arguments
パラメータリスト(リスト名はargments)がありますので、変数パラメータ関数を定義することができます.javascriptコード
NativePrintメソッドを注入した後、グローバルなCosolieオブジェクトを注入します.例えば、
console = {
default:this,
__Stringformat : function (values) {
function __toString(s)
{
if (s === null || s === undefined) {
return "";
}
return s.toString();
}
if (values.length == 0) {
return "";
} else if (values.length == 1) {
return __toString(values[0]);
}
index = 0;
return values[0].replace(/%([a-zA-Z_])/g, function (match) {
index = index +1;
if (values.length > index) {
return __toString(values[index]);
} else {
return "";
}
});
},
info : function () {
ffpd_log("info",this.__Stringformat(arguments));
},
warn : function () {
ffpd_log("warn",this.__Stringformat(arguments));
},
// Console
};
使用例console.info("%s %s %i","hello","world", 100);