沒什麼特別之處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
不帶內置的功能和方法的工作,這是由設計,並記錄在案:那是本節中描述的內置函數
無不是建設單位應當落實[建設]內部方法,除非在特定功能的描述中另有規定。 - http://es5.github.com/#x15
謝謝,但這並不能解釋爲什麼'new foo.bar'工作並且'new Math.round'沒有。 – georg
@ thg435因爲'Math.round'被設計爲失敗。就像我的函數MyClass.round被設計爲失敗。除非'foo.bar'專門設計爲在這種情況下失敗,否則不會。 – Paulpro
你有沒有任何證據證明「Math.round」實際上是這樣設計的? – georg