2016-05-20 8 views
0

私は、JSアクションなしで要素を失う可能性のある配列であるHTMLCollectionのようなものを実装しようとしています。Duktape/C配列要素のアクセサリー

私はmy_array.length財産を読み、メソッドmy_array.item(インデックス)を呼び出すことによって、アイテムを取得することができているオブジェクトを取得し、上記のようにそれをやって
duk_push_object(ctx); 
duk_push_string(ctx, "length"); 
duk_push_c_function(ctx, my_length_getter, 1); 
duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_GETTER); 
duk_push_c_function(ctx, my_item_getter, 1); 
duk_put_prop_string(ctx, -2, "item"); 

。しかし、私はmy_array [index]を使って項目を取得しません。 私は

duk_push_array(ctx); 

により上記の最初の行を交換した場合、私はlengthプロパティを設定できませんというエラーが発生します。 私が望むものを達成することは可能ですか? 'lazy'要素バインディングを持つ配列ですか?私はNetSurfが何らかの形でこれを管理しているが印象的なことをしています...

答えて

0

Ecmascriptは、getters/setters(アクセサ)とProxyオブジェクトの2つの主要なプロパティ仮想化メカニズムを提供しています。 Getters/setterは、事前に明示的に設定したプロパティに限定されているため、オブジェクトを完全に仮想化するためには必ずしも機能しませんが、プロキシオブジェクトはプロパティ読み書きのすべてを取得できます。

プロキシを使用してユースケースを実装できるはずです。 Duktapeは、プロキシトラップのサブセットを実装しています(http://duktape.org/guide.html#es6-proxyに記載されています)。すべてのプロパティの読み取りと書き込みをキャプチャする(しかし、ターゲットに転送)の最小限の例として:

var target = { foo: 'hello' }; 
var proxy = new Proxy(target, { 
    get: function (targ, key) { 
     print('get', key); 
     // may also return a virtualized value 
     return targ[key]; 
    }, 
    set: function (targ, key, val) { 
     print('set', key, val); 
     // may also capture (virtualize) write, or reject write 
     targ[key] = val; 
     return true; // indicate write was allowed 
    } 
}); 
print(proxy.foo); 
proxy.bar = 123; 

は「DUK」この版画を実行:

get foo 
hello 
set bar 123 
+0

[OK]を感謝します。私はまだCサイドからこれを構成するのが最善の方法を試していますが、Proxyオブジェクトは間違いなく必要です。この偉大なプロジェクト、デザイン/ API /ドキュメンテーション/サポートのための道がありがとう - あらゆる面でトップです。 – flyingfridge