0

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

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) {});
4

1 に答える 1

0

メッセージ パッシングではJSON.stringify、オブジェクトを文字列化するときにオブジェクトから関数を削除する を使用します。

なんで? 関数は単なるコードではありません。それは、変数/スコープ情報をロードしたクロージャです。関数がグローバル変数を使用し、関数が新しい実行環境に移動した場合、どのように動作する必要がありますか? (実際、この問題は「どのように振る舞うべきか?」というよりもはるかに深遠な問題であり、「関数内のスコープ内のすべての変数を関数とともにどのように転送できるか?」に似ています。)

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

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

于 2012-05-10T14:45:10.600 に答える