2012-03-10 40 views
2

From here爲什麼沒有「新」的Array()。slice工作?

function highest(){ 
    return makeArray(arguments).sort(function(a,b){ 
    return b - a; 
    }); 
} 

function makeArray(array){ 
    return Array().slice.call(array); 
} 

assert(highest(1, 1, 2, 3)[0] == 3, "Get the highest value."); 
assert(highest(3, 1, 2, 3, 4, 5)[1] == 4, "Verify the results."); 

現在,爲什麼Array()甚至返回一些有意義的事情,沒有一個new操作?多數「類」的定義我見過JS回報undefined如果不叫new

function User(name) { 
    this.name = name; 
    this.jump = function() { 
    console.log(name + " is jumping!"); 
    } 
} 

assert(typeof(User("no New")) == 'undefined'); 
+1

它不是那麼「爲什麼.slice()工作?」作爲「爲什麼Array()似乎和'new Array()'做同樣的事情?」 - 其中的答案可以概括爲「因爲規格說明」。請參見[Array(1)'和'new Array(1)']之間的區別是什麼?](http://stackoverflow.com/questions/5827008/whats-the-difference-between-array1-and-new-array1 -in-的JavaScript)。 – nnnnnn 2012-03-10 09:34:33

+0

@nnnnnn - Aye,投票結束爲dup,謝謝。 – ripper234 2012-03-10 09:54:41

回答

5

specification明確指出這一點:

Array被稱爲函數,而不是作爲一個構造函數,它會創建並初始化一個新的Array對象。因此功能調用Array(…)相當於對象創建表達式new Array(…)具有相同的參數

它是如何在內部完成依賴於實現,但對於自定義構造函數可以使用下面的技巧:

if(!(this instanceof User)) return new User(name); 

...因爲new User(...)this所創建的User實例,而User(...)它套到全局對象。 (所以你實際上是在過去的片段設置全局變量。)

1

基於Chrome瀏覽器的調試面板上,Array()在新Array()做同樣的方式返回一個新的數組或[]一樣。我的猜測是,它要麼是爲了易於使用該語言,要麼是與[]語法相關(當然這不需要新的語法)。

它實際上可能與自己的函數有選擇地需要一個新:

function User(name) { 
    if (!(this instanceof User)) { 
     return new User(name); 
    } 
    this.name = name; 
    this.jump = function() { 
     console.log(name + " is jumping!"); 
    }; 
} 

​ 

然後,兩個用戶(「嗒嗒」)新用戶(「嗒嗒」)工作。

相關問題