2017-03-09 3 views
1

Duktape over microchip 32を使用すると、すべて正常に動作します。 BTWは、モジュール読み込み(チャームのようにも動作しています)を使用しているとき、私はある種のパターン質問に直面しています。 私は今、私はanothersプログラム内でこのモジュールを使用していjsモジュール内でオブジェクトコンストラクタが定義されているときにCからJSオブジェクトコンストラクタを呼び出す

var MyObject = function(a){ 
this.a = a; 
} 
... 
module.exports = MyObject; 

JSモジュール内のコンストラクタを定義します。 は、私が説明することができます。

const toto = require('myobject'); 
var dummy = new toto('1'); 

まだ動作しています。モジュールを必要とするとき(基本的にユーザに関連しています)、影響を受ける名前( 'toto')を知らずに、CからMyObjectコンストラクタを呼び出しますか?

私は私がこれを回避するために、Cで完全にオブジェクトを宣言することができます知っているが、あなたの多分1つは持っている制約なしに代わり

const MyObject = require('myobject'); 

を宣言するための開発者に対し「をMyObjectに」を使用するためにシューッという音

duk_push_global_object(ctx); // [global] 
duk_bool_t res = duk_get_prop_string(ctx, -1, "toto"); // [global toto] 
duk_push_string(ctx, "1"); // [global toto param0] 
duk_new(ctx, 3); // [global result] 
duk_remove(ctx, -2); // [result] 

すでにベストプラクティスです。 duktapeはnodejsのようにグローバルスコープへのアクセスをモジュールに定義していないようです。 (私はこれをduk_module_node.cに追加することもできますが、最後の解決策です。)

ご意見ありがとうございます。

答えて

0

異なるパターンを試した後、最も直接的な解決策はモジュールラッパー(nodejsに似ています)として 'グローバル'パラメータを追加することです。

var _static = function (value, timestamp, quality, index) { 
    this.value = value; 
    this.timestamp = timestamp || new Date().getTime(); 
    this.quality = quality || _static.Quality.GOOD; 
    this.index = index || _static.INDEX_NONE; 
} 

_static.Quality = { GOOD: 0, UNCERTAIN: 1, BAD: 2, UNKNOWN: 3 }; 
_static.INDEX_NONE = -1; 

_static.prototype = (function() { 
    var _proto = _static.prototype; 
    return _proto; 
})(); 

module.exports = _static ; 
if(global) global.DatapointSample = global.DatapointSample || _static ; 

#ifdef ADD_GLOBAL_TO_MODULES 
    duk_push_string(ctx, "(function(exports,require,module,__filename,__dirname,global){"); 
#else 
    duk_push_string(ctx, "(function(exports,require,module,__filename,__dirname){"); 
#endif // ADD_GLOBAL_TO_MODULES 

    duk_dup(ctx, -2); /* source */ 
    duk_push_string(ctx, "})"); 
    duk_concat(ctx, 3); 

    /* [ ... module source func_src ] */ 

    (void) duk_get_prop_string(ctx, -3, "filename"); 
    duk_compile(ctx, DUK_COMPILE_EVAL); 
    duk_call(ctx, 0); 

    /* [ ... module source func ] */ 

    /* Set name for the wrapper function. */ 
    duk_push_string(ctx, "name"); 
    duk_push_string(ctx, "main"); 
    duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE); 

    /* call the function wrapper */ 
    (void) duk_get_prop_string(ctx, -3, "exports"); /* exports */ 
    (void) duk_get_prop_string(ctx, -4, "require"); /* require */ 
    duk_dup(ctx, -5);         /* module */ 
    (void) duk_get_prop_string(ctx, -6, "filename"); /* __filename */ 
    duk_push_undefined(ctx);       /* __dirname */ 
#ifdef ADD_GLOBAL_TO_MODULES 
    duk_push_global_object(ctx);      /* global */ 
    duk_call(ctx, 6); 
#else 
    duk_call(ctx, 5); 
#endif 

定義ADD_GLOBAL_TO_MODULESあなたは今、次のようにモジュールにjsのコードを使用することができますduk_module_node.h

#define ADD_GLOBAL_TO_MODULES 

にduk_module_node.cで は、ここでは、小さなコード変更

今すぐご利用いただけます

new DataPointSample() 

どこからでも名前を知ることができます。

私は、マイクロコントローラのファームウェアでCとJの両方の名前をつけておくことを強くお勧めします。

よろしくお願いいたします。

関連する問題