为什么方法在sendRequest()上从自定义对象丢失

时间:2012-05-10 14:34:56

标签: javascript google-chrome google-chrome-extension

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

1 个答案:

答案 0 :(得分:0)

消息传递使用JSON.stringify,它会在对象进行字符串化时删除对象中的函数。

为什么?一个函数不仅仅是代码 - 它是一个带有变量/范围信息的closure。如果函数使用全局变量并且函数移动到新的执行环境,它应该如何表现? (事实上​​,问题远比“它应该如何表现?”更为深刻,它更像是“函数范围内的所有变量如何与函数一起传输?”。

如果要传输功能代码(事先知道目标中存在必要的变量),可以在成员函数上使用toString来传输字符串并使用eval在抵达时重新创建它们。

JSON.stringify也会删除undefined值的成员。例如,JSON.stringify({"a":undefined})会产生"{}"。如果您希望保留这些值,请将它们设置为{ {1}}。设置为null的成员变量与根本没有设置的成员变量无法区分。)