簡體   English   中英

Javascript定義類

[英]Javascript define class

定義課程的最佳方法是什么? 我知道這一事實大部分時間都是您喜歡使用的選擇,但這3個例子之間的直接區別是什么?

例1

var Class = (function(){
    function Class() {
      this.test = 'test'                
    }
    return Class;
})();

var c = new Class();
console.log(typeof Class);
console.log(c.test);

例2

var Class2 = function(){
      this.test = 'test'                
};

var c2 = new Class2();
console.log(typeof Class2);
console.log(c2.test);

例3

function Class3(){
      this.test = 'test'                
};

var c3 = new Class3();
console.log(typeof Class3);
console.log(c3.test);

有時候我也會這樣使用它:var Class =(function(){var Private = {},Public = {};

    Private._doSomething = function() {
        // something
    }

    Public.doSomethingElse = function() {
        // something else
    }
    return Public;
    })();

注意:下面的主要答案是在2012年編寫的。有關JavaScript自己的class功能(ES2015 +)的其他說明,請參閱最后一部分。


“最好”本身就是一種主觀的東西,但我會試着指出一些關於每一個的信息,並讓你自己決定“最好”。

例1

...為您提供了一個方便的范圍(匿名函數),您可以在其中放置真正的私有類范圍的信息(和實用程序函數),只有Class函數才能訪問:

var Class = (function(){
    var trulyPrivateInformation = 42;

    function trulyPrivateUtilityFunction() {
        // ...
    }

    function Class() {
      this.test = 'test';
    }
    return Class;
})();

示例1未“懸掛”。 它作為逐步代碼的一部分進行處理。

Class函數將具有真實姓名。

例2

...創建一個沒有名稱的函數,並將其分配給具有名稱的變量。 現代瀏覽器非常聰明,但至少在理論上,該功能是匿名的,它會影響您的工具可以為您提供哪些信息。 那個(從ES2015開始)有一個名字( Class2 ),除了像IE這樣過時的環境。 它沒有示例1中的私有類范圍。

與示例1類似,示例2作為逐步代碼的一部分被處理,而不是被提升。

例3

...只是沒有私有類范圍的示例1,但它也是“已提升” - 在執行任何分步代碼之前定義了Class函數。 這意味着這有效:

var c = new Class();
console.log(c.test); // Logs 'test'

function Class() {
    this.test = 'test';
}

請注意,即使Class被定義為較低,也是上面的代碼運行之前完成的。 對於實施例1或實施例2,情況並非如此。

與示例1(但不是2)一樣, Class函數具有實名。


在2015年,JavaScript有自己的class語法。 在2019年,它得到了所有現代瀏覽器的原生支持,如果您需要支持IE,您可以使用像Babel這樣的工具進行轉換。 以下是class與OP問題的關系:

示例1與class

const Class = (() => {
    let trulyPrivateInformation = 42;

    function trulyPrivateUtilityFunction() {
        // ...
    }

    return class Class {
        constructor() {
            this.test = 'test';
        }
    }
})();

在逐步執行代碼時處理。 真正的私人范圍(在匿名范圍內功能)具有真正的私人范圍。 有一個正確的名字。

示例2與class (也是class示例3)

class Class2 {
    constructor() {
        this.test = 'test';
    }
}

let c2 = new Class2();
console.log(typeof Class2);
console.log(c2.test);

在逐步執行代碼時處理。 沒有真正的私有范圍示例1(盡管私有字段和方法即將推出)。 有一個正確的名字。

暫無
暫無

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

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