2012-05-10 11 views
0

クロム拡張のコンテンツスクリプトで単純なカスタムタイプを使用しています。 chrome.extension.sendRequest()を介して背景ページに送信されたアイテムの配列。 bgpageデバッガでは、私の型のインスタンスにこれらのメソッドがないことを示しています。また、未定義の値を持つ型のプロパティでも同じことが起こります。どうしましたか。sendRequest()のカスタムオブジェクトからメソッドが失われた理由

function User(id, holder) { 
    this.id = id; 
    var hObj = {}; 
    hObj[holder] = 'undefined'; // this is ok 
    this.holder = hObj; 
    this.Result = undefined; // this will be lost 
    this.Code = undefined; // this will be lost 
} 
// this will be lost 
User.prototype.getFirstHolderType = function() { 
    for (h in this.holder) { 
    if (h) return h; 
    } 
    return false; 
}; 
// this will be lost 
User.prototype.hasHolderType = function(h_type) { 
    for (h in this.holder) { 
    if (h_type === h) return true; 
    } 
    return false; 
}; 

//... 

chrome.extension.sendRequest({id: "users_come", users: users}, 
      function(response) {}); 

答えて

0

メッセージパッシングは、それが彼らをstringifiesとき、オブジェクトから機能を低下JSON.stringifyを、使用しています。

なぜですか?関数は単なるコード以上のものです。変数/スコープ情報がロードされているのはclosureです。関数がグローバル変数を使用し、その関数が新しい実行環境に移動すると、その動作はどうなるでしょうか?実際には、「どのように動作するのですか」という深刻な問題があります。「関数内のすべての変数を関数と共にどのように運ぶことができますか」のようなものです。)

あなたの関数コードを転送したい(そして必要な変数が目的地に存在することを事前に知っている)場合は、メンバー関数にtoStringを使用して文字列を転送し、evalを使用して到着時にそれらを再作成することができます。

JSON.stringifyundefined値を持つメンバーがドロップされます。たとえば、JSON.stringify({"a":undefined})"{}"が得られます。あなたはこれらの値を保存する場合は、nullに設定します。undefinedに設定メンバ変数でしたメンバ変数と区別がつきません

+0

'toString'は私のメソッドの長い文字列リテラルを含んでいますか、それとも他のメソッドがそれを直列化していますか? – Vasya

+0

私は関数の全文を渡すことが最良の解決策であると思います。また、 'eval(" function(){} ")'は失敗しますが 'eval("(function(){}) ")'が成功しているので、関数文字列の各端に括弧を追加する必要があるかもしれません。 – apsillers

関連する問題