JavaScript 来自 Chrome 扩展 api 的 OOP 和异步方法

JavaScript OOP and asynchronous methods from Chrome extension api

我正在制作一个 chrome 扩展,它使用了小块文本。 我制作了一个 class,每个块都是 class 的一个实例。这样:

function Block(bid){
    var block = Object.create(Block.prototype);
    block.title = "Default"
    block.content = "";
    block.bid = bid;
    return block;
};

Block.prototype.setTitle = function (){
    chrome.tabs.query({currentWindow: true, active: true}, function(tabs){
        this.title = tabs[0].title;
    });
};

我的问题是,当我在块 object 上调用 setTitle() 时,该方法没有更改标题 属性;它停留在 "Default"。我知道这与同步和异步方法有关,但我完全无法解决这个问题。

如有任何帮助,我们将不胜感激!

为避免进一步讨论,我假设这是一个范围界定问题。您能否尝试使用以下代码:

function Block(bid){
    var block = Object.create(Block.prototype);
    block.title = "Default"
    block.content = "";
    block.bid = bid;
    return block;
};

Block.prototype.setTitle = function (){

    var callback = function(tabs) {
        this.title = tabs[0].title;
    }

    chrome.tabs.query({currentWindow: true, active: true}, callback.bind(this));
};

这里的问题是你在回调中的 this.title 不是引用 Block 实例而是引用回调所以你只需要在变量中声明实例引用并使用它。

function Block(bid){
    var block = Object.create(Block.prototype);
    block.title = "Default"
    block.content = "";
    block.bid = bid;
    return block;
};

Block.prototype.setTitle = function (){

    var self = this; // Get the reference to the instance
    chrome.tabs.query({currentWindow: true, active: true}, function(tabs){
        self.title = tabs[0].title;
    });
};

Gyus,我不确定为什么每个人都复制这样一个构造函数,它确实创建了 returns 一个 Block 实例。

虽然问题得到了回答,但我建议采用以下方式来安排代码,同时防止范围问题。

function Block(id) {
    this.id = id;
    this.title = 'Default';
    this.content = '';
}

Block.prototype.setTitleByCurrentTab = function() {
    chrome.tabs.query({currentWindow: true, active: true},
                      this.setTitleByTab.bind(this));
}

Block.prototype.setTitleByFirstTab = function(tabs) {
    this.title = tabs[0].title;
}

如果有 2 个方法似乎是一种开销,可以按照 Mjh 的建议将后一个方法转换为 setter 中的闭包。

我只想在这里强调两件事:

  1. 最小构造函数
  2. 方法命名 - setTitle() 听起来像一个普通的 setter,客户可以期望那里有一个参数,除非它(以某种方式)知道实现细节