1

私はプライベート変数を使用し、パブリックメソッドを公開するプラグインの一部を持っています:

JSBIN 1

function  myWorld()
    {
      var myPrivate=1;
      this.do1=function (){alert(myPrivate);} ;
    }

var a=new  myWorld();

a.do1() //1
alert(a.myPrivate); //undefined (as it should be)

しかし、私はこれを再び行うのを防ぎたいです:new myWorld();

私が知っている唯一のオプションは、オブジェクトリテラルを使用することです。

JSBIN 2

var myWorld=
    {
      myPrivate:1,
      do1:function (){alert(this.myPrivate);} 
    }


alert(myWorld.myPrivate); //1 ( ouch....)
myWorld.do1() //1

質問

プライベートフィールドをカプセル化して、使用myWorldがインスタンス化されないようにするにはどうすればよい>1 timesですか?

4

5 に答える 5

2

これらの線に沿って何かを試してください:

(function(){
  var instanciated = false;
  window.myWorld = function() {
    if( instanciated) throw new Error("myWorld can only be instanciated once!");
    instanciated = true;
    var myPrivate = 1;
    this.do1 = function(){alert(myPrivate);};
  }
})();
于 2013-03-07T15:25:57.270 に答える
2

クロージャは、スコープを定義するための優れたツールです。

  var myWorld= (function(){
    var myPrivate = 1;
    return {
      do1:function (){alert(myPrivate);} 
    }
  }());


   myWorld.do1();

無料のLearningJavaScriptDesignPatternsの本をチェックすることをお勧めします

于 2013-03-07T15:26:02.273 に答える
1
var a = new function myWorld()
{
  var myPrivate=1;
  this.do1=function (){alert(myPrivate);} ;
}

これによりmyWorld、関数内でのみ使用できるようになります。イベントでアクセスできないようにする場合は、名前を削除します。

于 2013-03-07T15:29:21.253 に答える
1

IIFE内でプライベート変数を非表示にすることができます。

var myWorld = (function() { 
    var myPrivate = 1;
    return { ... };
}());
于 2013-03-07T15:26:14.227 に答える
1

シングルトンパターンを使用して、オブジェクトの1つのインスタンスを維持できます。何かのようなもの:

(function (global) {
    var _inst;

    global.myWorld = function () {
        if (_inst) throw new Error("A myWorld instance already exists. Please use myWorld.getInstance()");
        _inst = this;
    };

    global.myWorld.prototype = {
        do1: function() {
            console.log("do1");
        }
    };

    global.myWorld.getInstance = function() {
        if (_inst) return _inst;
        return new myWorld();
    };
}(window));

var world = new myWorld();
var world2 = myWorld.getInstance();
console.log(world === world2); // true
var world3 = new myWorld(); // throws Error
于 2013-03-07T15:56:07.963 に答える