Chrome 扩展存储自定义对象类型剥离原型方法

2023-12-22

我创建了一个在扩展中使用的自定义对象。当我保存 Group 类型(我的对象类型)的对象,然后将这些对象从存储中取出时,原型方法似乎不再存在。现在我在文档中读到对象序列化为对象文字{}我似乎不知道如何将方法与对象保持在一起。我在下面提供了小组课程的代码。当我尝试对从存储中检索的对象使用下面文件中的方法之一时,出现该函数不存在的错误。我使用 for in 循环来循环遍历所有属性,并且该对象具有 name 和 urls 属性。任何帮助将不胜感激!

组.js:

// Create the Group class
var Group = function (name, urls) {
  this.name = name;
  this.urls = urls;
};

// Clears all urls from the group
Group.prototype.clearUrls = function () {
  this.urls = [];
};

// Adds the specified url to the group
Group.prototype.addUrl = function (url) {
  this.urls.append(url);
};

// Removes the specified url from the group
Group.prototype.removeUrl = function (url) {
  this.urls = this.urls.filter(function(_url){
    return url !== _url;
  });
};

// Renames the group
Group.prototype.rename = function (name) {
  this.name = name;
};

// Checks whether or not the group contains the specified url
// Returns either true or false
Group.prototype.containsUrl = function (url) {
  var contains = false;
  for (var i = 0; i < this.urls.length; i++) {
    if (this.urls[i] === url) {
      contains = true;
      break;
    }
  }
  return contains;
};

EDIT:

这是background.js 脚本,它显示了如何检索对象以及稍后如何在脚本中调用它。当它收到addUrl消息并尝试调用时失败containsUrl()在当前组上。

// Global Variables
var currentGroup;
var groups = [];
var options = [];

// Short hand function to save the current data to storage
var saveData = function () {
  // Save default options, currrentGroup, and groups
  chrome.storage.sync.set({'options': options, 'currentGroup': currentGroup, 'groups': groups}, function() {
    if (chrome.runtime.lastError) {
      console.error("Could not save because: " + chrome.runtime.lastError);
    }
  });
}

// On start query for saved data to make sure data is current
chrome.storage.sync.get(function(items) {
  // Check if there are groups
  if (items['groups']) { // Set the groups
    groups = items['groups'];
  } else { // Create default group and add to list of groups
    currentGroup = new Group('default', []);
    groups = [currentGroup];
  }

  // Check for current group, if none set to first available group
  if (items['currentGroup']) {
    currentGroup = items['currentGroup'];
    console.log(Object.getOwnPropertyNames(currentGroup));
  } else {
    currentGroup = groups[0];
  }

  // Check for the options
  if (items['options']) {
    options = items['options'];
  } else {
    // No options, set the default options and save them
    options['overrideHomepages'] = true;
  }

  saveData();

  // After data has been fetched bring up the tabs
  chrome.tabs.query({'currentWindow': true}, function(tabs) {
    for (var i = 0; i < currentGroup.urls.length; i++) {
      if (options['overrideHomepages']) {
        if (tabs[i].url.length > 0) {
          chrome.tabs.update(tabs[0].id, {'url': currentGroup.urls[i]});
        } else {
          chrome.tabs.create({'url': currentGroup.urls[i]});
        }
      } else { // Don't override homepages or open tabs
        chrome.tabs.create({'url': currentGroup.urls[i]});
      }
      currentGroup.urls[i]
    }
  }); // End tabs.query

}); // End storage.sync.get

// Add message listener
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {

  // If add url was sent
  if (request.message === 'addUrl') {
    console.log('Recieved message: ' + request.message);
    // Check if the group contains the url already
    if (currentGroup.containsUrl(sender.url) === false) {
      currentGroup.addUrl(sender.url);
      saveData();
      sendResponse({'message': 'Saved ' + sender.url});
    }
  }

  // If remove url was sent
  if (request.message === 'removeUrl') {
    // Check if the group contains the url
    if (currentGroup.containsUrl(sender.url)) {
      currentGroup.removeUrl(sender.url);
      saveData();
      sendResponse({'message': 'Removed ' + sender.url})
    }
  }
});

我相信目前chrome.storage仅用于保存键值项,不包括原型/函数。但是,我没有找到任何关于此的官方文档。

一种解决方法是使用Group.prototype.containsUrl.call(currentGroup, sender.url),它允许您调用containsUrl指定上下文"this".

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chrome 扩展存储自定义对象类型剥离原型方法 的相关文章

随机推荐

  • 使用 JdbcPagingItemReader 导致连接语句导致 MySQLIntegrityConstraintViolationException

    我正在运行 Spring Batch 并使用JdbcPagingItemReader 示例配置为
  • 如何应用表格结构来选择 HTML 中的框选项

    在我的选择框选项中 每个选项都有三个单词 现在我想为选项的每个单词应用固定宽度 以便所有选项都会按我的要求出现 例如我的选项如下 1 aaaaa bbbbb ccccccccc 2 aaaaaaaa bbbbbbb cccc 3 aaaaa
  • 如何在运行时从 Solr 中过滤大量 id 列表

    我有一个索引products是索尔 我需要为每个客户提供定制的产品列表 这样我就必须为每个客户排除一些特定的产品 目前 我将客户和排除产品的这种关系存储在 SQL 数据库中 然后使用术语查询在 Solr 中过滤它们 有没有一种方法可以将这种
  • Typescript:如何表达类型仅限于多种类型之一的泛型函数

    例如 如果一个方法添加两个参数 a 和 b 它们应该具有相同的类型 并且该类型应该是字符串或数字 尝试1 function add a string number b string number return a b 这是行不通的 因为 a
  • 在 JavaScript 中查询 parse.com 对象中的指针

    我有一个班级Company其中有User指针 我想要的查询Company类是这样的 取回Company行 其中User对象的名称等于 ABC 那么 我应该如何形成这个查询 var Company Parse Object extend Co
  • Firebase 身份验证:在特殊电子邮件地址(例如 *@gmx.at)上发送但未收到的电子邮件

    我在用Firebase 身份验证在我的离子应用程序中 部分用户反映未收到验证邮件在用户注册后或触发 resendVerificationEmail 时发送 这对于 gmail com 或 live de 等电子邮件提供商来说效果很好 但对于
  • Djangocollectstatic没有这样的文件或目录

    在 django 1 7 中 collectstatic 为我抛出一个异常 OSError Errno 2 No such file or directory static 我表演过很多collectstatic 通话一切正常 但今天遇到了
  • Windows服务在重新启动后不会自动启动[重复]

    这个问题在这里已经有答案了 我的自动启动 Windows 服务仅在重新启动时才启动 我有一个用 C 创建的 Windows 服务 并通过 Wix 创建的安装程序安装 该服务设置为自动启动 该服务在 NT AUTHORITY NETWORK
  • 将 ViewModel 映射到 JS 对象

    是否可以将模型 服务器端 映射到 JS 对象 问题是我无法从服务器端返回 json 对象 查看 cshtml model TestModel Thanks 您可以使用Json Encode
  • 在php中从服务器中的视频创建缩略图

    在我的网站中 我可以选择由用户上传视频文件 我想创建该视频的缩略图 我已经在本地系统中尝试过一些编码 它工作正常 我尝试使用相同的编码来提供服务 但它不起作用 我检查了服务器中是否启用了 ffmpeg 它已被禁用 他们是否还有其他选项可以在
  • 挂钩 javascript 事件来加载页面

    我有一个 aspx 它在正文的 onload 事件期间运行以下 javascript 函数 但是 我将 aspx 设置为使用母版页 因此 body 标记不再存在于 aspx 中 如何注册 startClock 函数以在页面被点击时运行并且仍
  • 使用 qt 连接到 SQL Server [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何使用 Qt 连接到 SQL Se
  • WordPress 查询 - 按元字段值排序

    我有一篇包含三个元字段的帖子 add post meta my post times times 我想查询这个类别并按其中一个的元字段值对帖子进行排序 我现在使用的参数是 args array post type gt post categ
  • 如何同步两个重叠的 JavaScript onclick 事件

    Fiddle https jsfiddle net a0bwoev 3 https jsfiddle net a0bwouev 3 我的网站有两个 层 语言界面层 英语和法语 用户可以使用自己喜欢的语言浏览网站 这围绕网站内容 内容层 用户
  • 如何从堆栈中删除特定活动?

    假设我有这样的活动 A gt B gt C gt D 活动D has a Save按钮 单击该按钮后 我想取回堆栈中的两个活动 C and D是某种的一部分wizard所以我想把它们都删除 A gt B 这可能吗 从 D 启动活动 BFLA
  • android 如何从数组中包含数组的json获取数据

    我有一个应用程序 我想从本地服务器获取数据 喜欢 restarutant name Hotel Raja photo http i imgur com Mzt4u jpg address 93 2ndc ross GDP etx area
  • Pex(测试生成)真的有用吗?

    是的 可以为 Sum 或 Divide 等函数的边界值生成测试 Pex 是一个很好的工具 但更常见的是 我们对业务行为进行测试 让我们考虑一下 Beck 的经典 tdd 书中的示例 Test public void ShouldRoundO
  • 在mySQL数据库中插入多个数组值

    我有两个 PHP 变量 都是字符串 friendslist 2323443 7245 284683 345123 8456234 95432 id 10288272 我关心的表的结构如下 表名称 UserLinks link id user
  • jQuery 滑块教程?

    有谁知道一些解释如何使用 JQuery Slider 的好教程 我找到了一些 但没有一个真正清楚地表达了我所需要的内容 我真正需要弄清楚如何做的是使滑块从 1 0 5 0 包括所有十分之一 变化 并在其更改时根据该值设置隐藏控件 Thank
  • Chrome 扩展存储自定义对象类型剥离原型方法

    我创建了一个在扩展中使用的自定义对象 当我保存 Group 类型 我的对象类型 的对象 然后将这些对象从存储中取出时 原型方法似乎不再存在 现在我在文档中读到对象序列化为对象文字 我似乎不知道如何将方法与对象保持在一起 我在下面提供了小组课