LoginSignup
26
28

More than 5 years have passed since last update.

素の JavaScript でグローバル汚染しない2つの方法

Last updated at Posted at 2014-12-14

特に目新しい話ではないのですが、JavaScript で名前空間を汚染せずにライブラリ的な機能を追加したい場合のやり方2種類をまとめました。

基本的な考え方は、「自分用の名前空間を作ってそこにぶら下げる」です。

  • サーバサイドの話ではなく、ブラウザからの利用が前提です。
  • 「クラス」などの用語は JavaScript での説明としては正確ではないものの、Java の世界の住人としてわかりやすいものを使っています。

クラスとして提供

使う側が1ページ内で複数のオブジェクトを生成(new)する場合。

例えば以下のようなものの場合。

  • オレオレDate型
  • ページ内の複数の部品(例では動画プレーヤー)の制御

作り方(要するにJavaScriptでのクラスの作り方)

player.js
if (typeof myutil === 'undefined') {
  var myutil = {};
}
if (typeof myutil.Player  === 'undefined') {
  // この関数が Player クラスのコンストラクタになる。
  myutil.Player = function(_divName) {
    // インスタンス毎に持つ変数はここで this.xx として宣言する。thisは対象オブジェクト自身
    this.player = window.document.getElementById(_divName);
  };

  // クラスの関数はコンストラクタ外で Player.prototype.xx に追加
  // コンストラクタ内にこの関数を書いてしまうと new のたびに生成されてしまう
  myutil.Player.prototype.play = function() {
    this.player.play(); // thisは対象オブジェクト自身
  };
}

使い方

player.html
<head>
  <script type="javascript" src="player.js"></script>
</head>
<body>
  <video id="player1" width="360" height="240"><source src="1.mp4" type="video/mp4" /></video>
  <video id="player2" width="360" height="240"><source src="2.mp4" type="video/mp4" /></video>
  <script type="javascript">
    var myplayer1 = new myutil.Player("player1");
    var myplayer2 = new myutil.Player("player2");
    myplayer1.play();
    myplayer2.play();
 </script>
</body>

シングルトンオブジェクトとして提供

一つのページ内に複数のインスタンスが不要なものはこちらの方法で作ります。

向いているもの

  • jQuery などのユーティリティライブラリ
  • メニューなど画面全体の制御を行うもの

作り方

menu.js
if (typeof myutil === 'undefined') {
  var myutil = {};
}
if (typeof myutil.Menu  === 'undefined') {
  // シングルトンは無名関数をその場で呼び出す形で定義できる
  myutil.Menu = (function() {
    // 公開オブジェクト以外は var で宣言し無名関数のスコープの中に隠す
    var items  = [];

    var show = function(menuType) { // function show(menuType) { ... でも同じ
      document.getElementById('menu').innerHTML = '' + items.length + ' items';
    };

    // 公開するものだけをプロパティに持つ Object を生成して return する
    return {
      "show" : show,
      "addItem" : function(item) { items.push(item); } // 短いものはここに書いても良いかも
    };
  }()); 
}

使い方

menu.html
<html>
<head>
  <script type="text/javascript" src="menu.js"></script>
</head>
<body>
  <div id="menu" width="200" height="50">0 items</div>
  <script type="text/javascript">
    myutil.Menu.addItem('1');
    myutil.Menu.show();
  </script>
</body>
</html>
26
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
28