コンストラクタとして呼ばれたか、単なる関数として呼ばれたかを判定する

なんとなく思いつきで、、
組み込み関数のString()やNumber()なんかは、コンストラクタとして呼ばれる場合と単なる関数として呼ばれる場合で違う振る舞いになるけど、実際そいうった関数を作るにはどうしたらいいんだろうと考えてみました。

で、思いついたのは、下記のようにthisが何かで判断する方法だけでした。

function Hoge() {
  if (this instanceof Hoge) {
    print('constructor');
  } else {
    print('function');
  }
}

Hoge();     //=>function
new Hoge(); //=>constructor

thisをそのオブジェクトにして関数として呼び出せる方法もある(apply使うか、HogeオブジェクトのプロパティにHoge関数を代入して呼び出し)ので、厳密には判定できなそうですが、まぁ、そんな使い方しなそうだしこれでいいのかなぁ。(というか他にあるのかなぁ)

var hoge = new Hoge(); //=>constructor
Hoge.apply(hoge);      //=>constructor