JSCore/V 8環境でJavaScriptのConsolie機能を実現


JavaScript原生の中ではデフォルトではConsolieオブジェクトがありません.これは宿主のオブジェクトが提供する内蔵オブジェクトです.webviewに内蔵されていますが、JSCoreのようなJSエンジンでは機能が実現されていませんので、フロントエンドのデバッグが便利で、コードの移植性もありますので、手動で実現する必要があります.大体の実現構想は以下の通りです.
グローバルに注ぎ込むログ印刷関数
全体的なログ印刷関数を注入して、名前を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);