【问题标题】:Override Chrome Storage API覆盖 Chrome 存储 API
【发布时间】:2020-09-13 11:12:34
【问题描述】:

我想覆盖 chrome.storage.local.set 以便在调用 Chrome 存储 API 时记录存储密钥的值:

var storage_local_set = chrome.storage.local.set;
chrome.storage.local.set = function(key, value) {
    console.log(key);
    storage_local_set(key);    
}

但是当storage_local_set(key) 被调用时,我会得到Illegal invocation: Function must be called on an object of type StorageArea。记录密钥后如何存储数据?

对于chrome.storage.sync.set,这是我根据给出的解决方案尝试的:

const api = chrome.storage.sync;
const { set } = api; 
api.set = function (data, callback) {
  console.log(data);
  set.apply(api, arguments);  
};

但这并没有挂钩 API

【问题讨论】:

    标签: google-chrome google-chrome-extension google-chrome-storage


    【解决方案1】:

    您需要使用 .call() 或 .apply() 提供this 对象:

    storage_local_set.apply(this, arguments);
    

    您覆盖的参数与文档不匹配。如果您想匹配文档,请这样做:

    const api = chrome.storage.local;
    const { set } = api; 
    api.set = function (data, callback) {
      console.log(data);
      set.apply(api, arguments);    
    };
    

    如果您想将签名更改为单独的键和值:

    const api = chrome.storage.local;
    const { set } = api; 
    api.set = (key, value, callback) => {
      console.log(key, value);
      set.call(api, {[key]: value}, callback);    
    };
    

    【讨论】:

    • tnx.我也想对chrome.storage.sync 做同样的事情,但它没有上瘾?
    • 既然我没看到你做了什么,我也帮不上忙。
    • 在同一个作用域中不能有两个同名的变量(setapi),所以你需要重命名第二个变量。
    • 我做到了,但我仍然无法挂钩 API(调用 chrome.storage.sync.set 时没有设置任何内容
    • 那么还有一些与此代码无关的错误。或者你错误地重命名了它们:-)顺便说一句,你可以通过用{}包围块来强制一个新的块范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2011-08-17
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多