Warum scheint der „diese“-Kontext innerhalb einer Klasse nicht implizit zu sein (im Gegensatz zu MDN-Dokumenten)?JavaScript

Javascript-Forum
Anonymous
 Warum scheint der „diese“-Kontext innerhalb einer Klasse nicht implizit zu sein (im Gegensatz zu MDN-Dokumenten)?

Post by Anonymous »

Ich habe keine Ahnung, was mit der Javascript-Ausführung los ist. Javascript ist nicht meine Stärke, aber man muss es verwenden, wenn man Websites erstellt, also bin ich nicht völlig unwissend und wir haben eine Menge Javascript/jQuery an eine WordPress-Site angehängt. Alle Regeln zum korrekten Einreihen in die Warteschlange werden befolgt, und die jQuery ist eingebunden, um eine doc.ready- und noConflict-Ausführung sicherzustellen.
Wir integrieren gerade einen neuen MUX-Videoplayer, der wirklich großartig ist, aber den „Nachteil“ hat, dass auf einige Eigenschaften derzeit nur mit Javascript zugegriffen werden kann. Einer meiner Kollegen hat einen Code-Prototyp erstellt, und ich habe mich vor dem Gott der Kapselung verbeugt und dachte, das gehört wirklich in eine eigene Klasse, nämlich dieser Code:

Code: Select all

class KCM_MUX {

lang;
player;

constructor(lang, player){
this.lang = lang;
this.player = player;
this.setLanguage();
}

// the actual code returned will depend on how the file has been uploaded.
norm = s => (s || '').toLowerCase().split('-')[0]; // "de-DE" -> "de"
// player = document.getElementById('muxPlayer');

#setAudio() {

const list = this.player.audioTracks; // Mux-provided AudioTrackList
if (!list || list.length === 0) return;
let matched = false;

for (let i = 0; i < list.length; i++) {
const t = list[i];
// check the language and label - this will be defined on upload
const code = this.norm(t.language) || this.norm(t.label);
const on = code && code.startsWith(this.lang);
t.enabled = on;
if (on) matched = true;
}
// If nothing matched, ensure at least the first track is enabled.
if (!matched) {
list[0] && (list[0].enabled = true);
}
}

#setSubs () {

const tt = this.#getTextTracks();

if (!tt) return;

for (let i = 0; i < tt.length; i++) {
const t = tt[i];
const isCaption = t.kind === 'captions' || t.kind === 'subtitles';
if (!isCaption) continue;
const code = this.norm(t.language) || this.norm(t.label);
t.mode = code && code.startsWith(this.lang) ? 'showing' : 'disabled';
}
}

#getTextTracks() {
return this.player.textTracks || this.player.media?.nativeEl?.textTracks || null;
}

setLanguage(event) {
this.#setAudio();
this.#setSubs();
}

}
Wenn wir uns nun die Dokumente zu MDN durcharbeiten, scheint es darauf hinzudeuten, dass das Wort „this“ für den Aufruf von klasseninternen Prozeduren innerhalb der Klasse unnötig sein sollte, sodass der Konstruktor einfach setLanguage() aufrufen können sollte, und wir sollten in der Lage sein, norm(), getTextTracks usw. ohne „this“ aufzurufen? Verstehe ich das falsch, aber der Code wird ohne all diese „this“-Präfixe nicht ausgeführt?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post