国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Bagaimana untuk melaksanakan kelas asas rantai warisan secara langsung dalam Javascript (OOP)?
P粉718165540
P粉718165540 2024-01-10 17:20:07
0
1
515

Saya sedang mengusahakan rantaian warisan 3 kelas boleh dilanjutkan.

Renderer (asas) -> Peti Mel (kanak-kanak) -> Peti SuratMasuk (anak akhir)

Mereka masing-masing mempunyai kelas render方法。孩子只是重寫渲染器(基礎(chǔ))render方法最后他們無(wú)論如何應(yīng)該使用渲染器render kaedah(Asas< /strong>) mereka sendiri. Masalah saya ialah apabila saya melaksanakan kaedah tertentu dalam kelas Renderer (createElementWithTextInside), ia tidak betul-betul melaksanakan kaedah Renderer's render (Renderer .render()), tetapi ia melakukannya dari kelas extensible Starts di hujung rantai. Contohnya, ia mula melintasi:

1 - MailboxInbox.render

2 - Mailbox.render

3 - Renderer.render

Saya faham cara kelas/warisan js berfungsi di sebalik tabir. Javascript hanya memanjangkan prototaip objek dan skrip akan berulang ke atasnya dsb. Tetapi soalan saya ialah: Bagaimanakah saya boleh mengelakkan tingkah laku ini dan terus memanggil kaedah Renderer.render dalam kaedahnya apabila diperlukan?

Saya tidak dapat menyimpan __diri dalam penyebar kerana ia akan menunjuk ke this contoh semasa (MailboxInbox) pula. Juga, saya tidak boleh menggunakan .bind/lambda (fungsi anak panah) kerana saya perlu menyimpan konteks

Violin

class Renderer {
    
      get noResultContent() {
        const p = this.createElement('p', 'no-result-msg');
        const textNode = document.createTextNode('No result');
        p.appendChild(textNode);
    
        return p;
      };
    
    
    
      createElement(tag, className) {
        if (!tag) throw new Error('Tag must be passed!');
    
        const res = document.createElement(tag);
        res.classList.add(className);
        return res;
      }
      
      createTextNode(text) {
        const res = document.createTextNode(text);
        return res;
      }
    
      /**
       * automatically creates an el based on tag, text node and insert the text node into the el
       */
      createElementWithTextInside(tag, className, content) {
    
        const el = this.createElement(tag, className);
        const text = this.createTextNode(content);
        this.render(el, text);
    
        return el;
      }
      
      checkIfDomEl = el => el instanceof Element;
    
    
      render(el, content) {

        console.log('3: RENDERER RENDER')
        if (!this.checkIfDomEl(el)) throw new Error(`Please, pass the valid DOM el. Received: ${el}, ${typeof el} `);
    
        const finalContent = content || this.noResultContent;
        
        el.appendChild(finalContent);
      }
    
    }
    --------
    class Mailbox extends Renderer {
      rootEl;
    
      
    
      constructor(selector) {
        super();
        this.rootEl = document.querySelector(selector);
      }
    
      renderTitle(content) {
        if (!content) return null;
    
        const titleEl = super.createElementWithTextInside('h3', 'mailbox-title', content)
    
        super.render(this.rootEl, titleEl);
    
      }
    
      render() {
        console.log('2: MAILBOX RENDER')
        super.render(this.rootEl);
      }
    }
    --------
    class MailboxInbox extends Mailbox {
    
      title = "Inbox"
    
      constructor(params) {
       const { selector } = params;
       super(selector); 
      }
    
      renderTitle() {
        super.renderTitle(this.title);
      }
    
      render() {
        console.log('1: INBOX RENDER')
        super.render();
      }
    }
--------
const inbox = new MailboxInbox({selector: '#container'}); 
inbox.renderTitle()

Di sini ia hanya dipaparkan dalam konsol:

1: Penyampaian peti masuk

2: Penyampaian peti mel

3: Penyampaian pemaparan

Terima kasih atas bantuan anda! salam hormat!

Dikemas kini

Pada asasnya saya hanya mahu mempunyai kelas render asas yang boleh menerima parameter: (el,content) (kandungan adalah pilihan) dan render 類,它可以接受參數(shù):(el,content)(內(nèi)容是可選的)和Children我想用一些預(yù)定義的 elcontent 等在他們自己的 .render() 方法中覆蓋它,但是如果我嘗試執(zhí)行 renderer.render() 方法來(lái)自 Renderer 內(nèi)部,它遍歷整個(gè)鏈,我的參數(shù)丟失了,因?yàn)樵?MailboxInbox 中,渲染方法當(dāng)前沒有'不接受任何參數(shù),所以我要么應(yīng)該讓它接受參數(shù)并將它們傳遞到整個(gè)鏈,要么只是在 Renderer 中定義一些專用類,如 baseRenderKanak-kanak< /p>Saya mahu menggunakan Beberapa pratakrif < code>el dan content dsb. mengatasinya dalam kaedah .render() mereka sendiri, tetapi jika saya cuba melaksanakan renderer.render() kaedah datang dari dalam ??Renderer?? dan ia melalui keseluruhan rantaian dan parameter saya hilang kerana dalam ??MailboxInbox?? kaedah render pada masa ini tidak menerima sebarang parameter, jadi saya harus sama ada membuatnya Terima parameter dan luluskannya sepanjang rantaian, atau tentukan beberapa kelas khusus seperti baseRender dalam ??Renderer?? dan panggil terus ??

P粉718165540
P粉718165540

membalas semua(1)
P粉618358260

Secara teknikal anda boleh menggantikan this.render(el, text); dengan

Renderer.prototype.render.call(this, el, text);

Ia memintas carian harta warisan. Walau bagaimanapun, ini secara amnya bukan amalan yang baik dan akan kehilangan kelebihan harta pusaka. class

Nasib baik, anda telah mengenal pasti masalah sebenar dengan kemas kini anda:

Ini secara salah mengatasi kaedah dengan tandatangan yang tidak serasi, melanggar

Prinsip Penggantian Lebih Kaya.

Anda juga telah mengenal pasti penyelesaian yang berpotensi:

Kedua-duanya bagus. Dalam yang terakhir, saya mengesyorkan supaya tidak menamakan kaedah

sebaliknya). renderbaseRender,而是推薦類似 renderContent(el, content)renderDefault (el),它們的簽名實(shí)際上不同 - 并且都可以被覆蓋。然而,看看使用兩個(gè)參數(shù)調(diào)用時(shí) render 的實(shí)現(xiàn),在我看來(lái),除了調(diào)用 el.appendChild(content) 之外,它實(shí)際上沒有做任何有用的事情,所以我'寧愿完全放棄它并只調(diào)用 appendChild (除非您需要覆蓋具體行為的能力,例如通過執(zhí)行 el.prepend(content)

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan