簡體   English   中英

當兩者都在閉包的return語句內時擴展Javascript類

[英]Extending a Javascript class when both are within a return statement of a closure

我仍在學習閉包,因此考慮到它們的性質,這可能是不可能的,所以請多多包涵。 我有一個全局變量,它是一個從閉包返回的對象。 該對象的某些屬性是類。

var TEST = (function() {
    return {
        Base: class {
            constructor() {}
            hello() { console.log("Hello"); }
        },
        Extended: class { // what do I do here?
            constructor() {}
        }
    }
})();

我能夠聲明var b = new TEST.Base()並在該var上調用hello()函數,按預期方式工作。

我想使TEST.Extended擴展TEST.Base並可以訪問其自己的hello()函數,並且到目前為止還沒有任何運氣。 我嘗試過的東西:

// 1 - ReferenceError: Base is not defined
Extended: class extends Base {...}

// 2 - TypeError: TEST is undefined
Extended: class extends TEST.Base {...}

// 3 - ReferenceError: NamedClass is not defined
Base: class NamedClass {...},
Extended: class OtherNamedClass extends NamedClass {...}

// 4 - TypeError: TEST is undefined
Base: class NamedClass {...},
Extended: class OtherNamedClass extends TEST.NamedClass {...}

我不確定其他選擇。 這可能在Javascript中嗎?

您在這里遇到多個問題。

首先,如果您使用的類意味着您在其中聲明的文件幾乎可以肯定被視為模塊 ,這意味着頂級變量在定義它們的文件之外不會自動可見。您必須import TEST或執行諸如window.TEST = (function(){...之類的功能包裝器...

盡管IIFE確實創建了一個不相關的閉包,因為您沒有對任何內容進行閉包:正如您所寫的那樣,包裝器毫無意義。

var TEST = {
  Base: class { /* definition goes here */ }
};

和你寫的一樣 為了使閉包具有任何實用程序,您需要在其中隱藏某些內容。

var TEST = (function() {
  var private = whatever;
  return {
    Base: class {}
  };
})();

return ed對象關閉了private。

現在開始您的實際問題。

如何將擴展類導出為TEST對象的一部分。 簡短的答案:您不能那樣做。 它需要引用TEST.Base而您不能以這種方式在對象定義中進行引用。 有幾種選擇,但是如果您不希望公開Base,這就是我要采取的措施:

var TEST = (function() {
  var Base = class { /* class definition goes here */ };
  return {
    Base,
    Extended: class extends Base { /* extension definition goes here */ }
  };
})();

注意,這仍然是不必要的。 您可以輕松地編寫

var Base = class {};
var TEST = { Base, Extended: class extends Base {} };

實際上,現在我們有了ES 6模塊(或可以可靠地偽造它們),這的確是應該編寫的方式(IMHO)。 您可以決定是自己導出Base還是僅通過API對象TEST訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM