Я пытался написать Firefox веб-расширение, используя TypeScript. Поскольку это довольно странное усилие, расширение довольно простое; это должны быть часы. У меня есть три сценария и один класс, который экспортируется как модуль. Моя проблема в том, что при изменении контекста мои функции-члены класса, похоже, не сохраняют свои привязки к своему объекту (таким образом, становятся неопределенными). Сценарии вызываются нажатием указанной страницы: [ click content -> background -> content (resp)].
/**
* Holds basic system/browser time data
*/
export class Clock {
private time : string;
private hh : number;
private mm : number;
private ss : number;
constructor(date : Date) {
this.hh = date.getHours();
this.mm = date.getMinutes();
this.ss = date.getSeconds();
this.time = this.setTime();
this.getTime = this.getTime.bind(this);
this.logTime = this.logTime.bind(this);
}
public setTime = (): string => {
return `${this.hh}:${this.mm}`;
}
public clockStringify = () : string => {
const timeData = {
hh : this.hh,
mm : this.mm,
ss : this.ss,
time: this.time
};
return JSON.stringify(timeData);
}
public logTime() : void {
console.log(`${this.hh}:${this.mm}`)
}
public getTime() : string {
return this.time;
}
}
/*
* This is from the content.ts script which runs on top of the web-page in FF
*/
function handleResponse(clock : Clock) {
console.log("Content RESP handler >> ");
console.log("Clock info dump >>");
console.log(clock.clockStringify());
clock.logTime();
console.log(clock.getTime());
}
/*
* This from my background.ts script which runs in the background-page of FF
*/
function handleMessage(request : any, sender : any, sendResponse : any) {
let clock = new Clock(new Date());
console.log("Background handler >> " + request);
console.log("Clock info dump >>");
console.log(clock.clockStringify());
clock.logTime();
console.log(clock.getTime());
sendResponse(clock);
}
Транспортированный JavaScript для Clock.ts:
/**
* Holds basic system/browser time data
*/
export class Clock {
constructor(date) {
this.setTime = () => {
return `${this.hh}:${this.mm}`;
};
this.clockStringify = () => {
const timeData = {
hh: this.hh,
mm: this.mm,
ss: this.ss,
time: this.time
};
return JSON.stringify(timeData);
};
this.hh = date.getHours();
this.mm = date.getMinutes();
this.ss = date.getSeconds();
this.time = this.setTime();
this.getTime = this.getTime.bind(this);
this.logTime = this.logTime.bind(this);
}
logTime() {
console.log(`${this.hh}:${this.mm}`);
}
getTime() {
return this.time;
}
}
JavaScript для background.ts и content.ts практически одинаковы, поэтому пропустите.
Я просмотрел все и нашел решение, которое можно увидеть выше в Clock.ts. Я в недоумении от того, что, почему они привязки не работают правильно. Я использовал разные методы ставок в Clock.ts, чтобы увидеть, есть ли разница, но нет.
Мой вывод FF:
Webconsole context has changed
Background handler >> [object Object] background.js:6:13
Clock info dump >> background.js:7:13
{"hh":11,"mm":55,"ss":32,"time":"11:55"} background.js:8:13
11:55 Clock.js:26:17
11:55 background.js:10:13
...
Content script loaded >> content.js:1:9
Content RESP handler >> content.js:12:13
Clock info dump >> content.js:13:13
...
[extension-runners/index.js][debug] Reloading installed extensions on user request
[extension-runners/index.js][debug] Reloading all reloadable add-ons
[firefox/index.js][debug] Firefox stdout: 1586919326952 addons.xpi WARN Addon with ID ac86eefbc0a51ff2c5ab50e8b732e9c26c23dea6@temporary-addon already installed, older version will be disabled
[firefox/remote.js][debug] Received message from client: {"from":"root","type":"addonListChanged"}
Last extension reload: 11:55:27 GMT+0900 (Japan Standard Time)[firefox/remote.js][debug]
[firefox/index.js][debug] Firefox stderr: JavaScript error: moz-extension://68316183-66b2-f244-be4a-a97929269985/js/content.js, line 14: TypeError: clock.clockStringify is not a function
Я перемещаюсь к "target": "ES2016"
и "module": "es2015"
. Есть ли какая-то концепция, которую мне не хватает в привязках? Разве они не работают в одном контексте браузера?