3

次の点を考慮してください。

x = function () {}
p = new x()
console.log(p) // ok

Math.z = function () {}
p = new Math.z()
console.log(p) // ok 

p = new Math.round()
console.log(p) // TypeError: function round() { [native code] } is not a constructor

newそのため、独自の関数では使用できますが、では使用できませんMath.round。何がそんなに特別なのですか?これはどこかに文書化されていますか?

4

3 に答える 3

8

特別な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

于 2012-05-07T07:01:51.793 に答える
2

それはメソッドであるため、前に置くことはできませんnew

PS:

new alert()        //TypeError: Illegal invocation
new console.log()  //TypeError: Illegal invocation
new function(){}   //OK
于 2012-05-07T06:58:16.270 に答える
1

Math はクラスなので、そこからオブジェクトを作成できます。Math.round は Math のメソッドです。メソッドからオブジェクトを作成することはできません。

于 2012-05-07T06:58:07.660 に答える