8

クラスを定義する最良の方法は何ですか? ほとんどの場合、これはあなたが使用したいものを選択するという事実を認識していますが、これら 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;
    })();
4

1 に答える 1

7

注:class以下の主な回答は 2012 年に書かれたものです。JavaScript 独自の機能 (ES2015+)に関する追加の注記に​​ついては、最後を参照してください。


「最高」は本質的に主観的なものですが、それぞれについていくつかの情報を指摘し、「最高」について自分で判断できるようにします。

例 1

Class...関数のみがアクセスできる真にプライベートなクラス全体の情報(およびユーティリティ関数)を配置できる便利なスコープ(無名関数)を提供します。

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

    function trulyPrivateUtilityFunction() {
        // ...
    }

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

例 1 は「巻き上げ」ではありません。これは、ステップバイステップ コードの一部として処理されます。

関数にはClass実名があります。

例 2

...名前のない関数を作成し、名前のある変数に割り当てます。最新のブラウザはそれについてかなり賢いですが、少なくとも理論的には、関数は匿名であり、ツールが提供できる情報に影響を与えます. Class2IE のような古い環境を除いて、(ES2015 の時点で) 名前は ( ) です。例 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 などのツールを使用してトランスパイルできます。classOPの質問にどのように関連するかは次のとおりです。

例 1class

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

    function trulyPrivateUtilityFunction() {
        // ...
    }

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

コードの段階的な実行で処理されます。真にプライベートなもののための真にプライベートなスコープ (匿名スコープ関数内) を持っています。固有名詞あり。

を使用した例 2 class(これは を使用した例 3 でもありますclass)

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

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

コードの段階的な実行で処理されます。例 1 にある真のプライベート スコープはありません (ただし、プライベート フィールドとメソッドは近日公開予定です)。固有名詞あり。

于 2012-12-05T14:12:36.663 に答える