特別なMath.round
ことではありません。この動作を独自の関数で複製できます。
MyClass = function(){};
MyClass.round = function(x){
if(this instanceof MyClass.round)
throw 'TypeError: MyClass.round is not a constructor';
return Math.round(x);
}
console.log(MyClass.round(0.5)); // 1
new MyClass.round(); // 'TypeError: MyClass.round is not a constructor'
実際、同様のパターンを使用new
して、クラスでキーワードをオプションにすることができます。
function MyClass(){
if(!(this instanceof MyClass)) // If not using new
return new MyClass(); // Create a new instance and return it
// Do normal constructor stuff
this.x = 5;
}
(new MyClass()).x === MyClass().x;
組み込みの関数とメソッドで動作しない理由についてnew
は、これは仕様によるものであり、文書化されています。
この節で説明されているコンストラクターではない組み込み関数は、特定の関数の説明で特に指定されていない限り、[[Construct]] 内部メソッドを実装してはなりません。-- http://es5.github.com/#x15