6

私は最近 JavaScript を深く掘り下げていて、ある質問に出くわしました。

次のオブジェクトの実装の違いは何ですか:

var myFunction1 = (function myFunction1() {})();

var myFunction2 = {}

var myFunction3 = function myFunction3() {}

または、まったく同じタスクを実行する 3 つの実装の長い例を使用します。

<script>
    var myFunction1 = (function myFunction1() {

      var _privateVar = 'Private var';
      this.publicVar = 'Public var';

      function init( newPrivate, newPublic) {
        _privateVar = newPrivate;
        this.publicVar = newPublic;
      }

      function getPrivateVar(){
        return _privateVar;
      }

      function setPrivateVar(string){
        _privateVar = string;
      }

      return {
        init: init,
        getPrivateVar: getPrivateVar,
        setPrivateVar: setPrivateVar
      }

    })();

    var myFunction2 = {

      _privateVar: 'Private var',
      publicVar: 'Public var',

      init: function init( newPrivate, newPublic) {
        this._privateVar = newPrivate;
        this.publicVar = newPublic;
      },

      getPrivateVar: function getPrivateVar(){
        return this._privateVar;
      },

      setPrivateVar: function setPrivateVar(string){
        this._privateVar = string;
      }

    }

    var myFunction3 = function myFunction3() {

      var _privateVar = 'Private var';
      this.publicVar = 'Public var';

      function init( newPrivate, newPublic) {
        _privateVar = newPrivate;
        this.publicVar = newPublic;
      }

      function getPrivateVar(){
        return _privateVar;
      }

      function setPrivateVar(string){
        _privateVar = string;
      }

      return {
        init: init,
        getPrivateVar: getPrivateVar,
        setPrivateVar: setPrivateVar
      }

    }

    var a, b, c;
    a = myFunction1;
    a.init('Private var updated', 'Public var updated');
    console.log('== A ==');
    console.log(a.publicVar); // Public var updated
    console.log(a._privateVar); // undefined
    console.log(a.getPrivateVar()); // Private var updated
    a.setPrivateVar('Private var is updated again');
    console.log(a.getPrivateVar()); // Private var is updated again

    b = myFunction2;
    b.init('Private var updated', 'Public var updated');
    console.log('== B ==');
    console.log(b.publicVar); // Public var updated
    console.log(b._privateVar); // Private var updated
    console.log(b.getPrivateVar()); // Private var updated
    b.setPrivateVar('Private var is updated again');
    console.log(b.getPrivateVar()); // Private var is updated again

    c = new myFunction3();
    c.init('Private var updated', 'Public var updated');
    console.log('== C ==');
    console.log(c.publicVar); // Public var updated
    console.log(c._privateVar); // undefined
    console.log(c.getPrivateVar()); // Private var updated
    c.setPrivateVar('Private var is updated again');
    console.log(c.getPrivateVar()); // Private var is updated again
</script>

最初の 2 つの例はシングルトンであり、最後の例では複数のオブジェクトを作成できます。しかし、最初の 2 つの違いは何ですか? それとも、少し書き方が違うだけで同じですか?

4

2 に答える 2

4

最初の例では、関数myFunction1()を作成して実行し、結果 (関数ではない) を変数に格納しますmyFunction1。この場合、名前 myFunction1には最初に関数が含まれ、次に (実行されると) 結果が含まれます。

myFunction2はまったく関数ではありません。括弧{}はオブジェクト リテラルであり、空のオブジェクトを作成します。

myFunction3は、この例の唯一の関数です。この場合、何もしません。

于 2013-06-28T14:31:24.847 に答える