JSLintオプション考察「uncapitalized constructors」

2013年07月22日

カテゴリー:

「uncapitalized constructors」オプションは、関数名が小文字で始まるコンストラクタ関数の定義を許可するかどうかのオプションです。デフォルト(false)では、小文字から始まるコンストラクタ関数名は許可されず、同時に、大文字から始まる関数はコンストラクタ関数であるとみなされます。

function boy() {
    "use strict";

    this.name = "Taro";
    this.age = 10;
}

var taro = new boy();  //A constructor name ‘boy’ should start with an uppercase letter

上のコード例では、関数 boy() はコンストラクタ関数ですが、関数名が小文字で始まっているため、JSLintでは「A constructor name ‘boy’ should start with an uppercase letter.(コンストラクタ関数名は大文字から始めるべき)」という警告が表示されます。

function Boy() {
    "use strict";

    this.name = "Taro";
    this.age = 10;
}

var taro = new Boy();

上のコードの様に、コンストラクタ関数名の先頭を大文字にすれば警告は表示されません。

ただし、この場合 Boy() はコンストラクタ関数としてみなされるため、次の様にnew無しで呼び出してしまうと「Missing ‘new’.」という警告が出ます

var taro = Boy(); //Missing 'new'.

つまり、このオプションがデフォルト(false)の場合、

  • new の後に呼び出される関数(コンストラクタ関数)の関数名は大文字から始めなければならない
    (※このような命名規則を「アッパーキャメルケース」といいます)
  • 関数名が大文字から始まる関数はコンストラクタ関数とみなされるので、呼び出す際は new を付けなければならない

ということになりますね。

JavaScriptでは、オブジェクトを作成(初期化)する役目を持つコンストラクタ関数は大文字から始まる名前を付けるのが作法です。(逆に、コンストラクタ関数ではない通常の関数は小文字から始めるのが作法)

▼コンストラクタ関数名の例

  • function Parson() {...};
  • function Dog() {...};
  • function Book() {...};

▼通常の関数(またはメソッド)名の例

  • function talk() {...};
  • function run() {...};
  • function getTitle() {...};

JavaScriptにおいて、コンストラクタ関数とそうでない関数(通常の関数)の区別を明確にすることは非常に重要です。 コンストラクタ関数を通常の関数の様に new なしで呼び出してしまった場合、コンストラクタ関数内の this はグローバル変数を指してしまう※ため、グローバルを書き換えてしまう恐れがあるためです。

※ES5では、thisの参照先がグローバルオブジェクトであった場合undefinedを返すようになります。


このようなミスを犯さないためにも、JSLintのオプション「uncapitalized constructors」はデフォルト(false)のままにしておいた方が良いでしょう。

JSLintのオプション一覧ページへ