2012-07-27 70 views
1
  1. 是否有任何anyObject.constructor屬性爲null或未定義的可能性(尤其是當ConstructorFunc.prototype未被修改/覆蓋時)?
  2. var date = new Date(); console.log(date.constructor); //記錄「日期()」。好的。
    var data = new Array(1, 2, 3); console.log(data.constructor); //它會記錄類似[undefined]的內容。它是什麼,爲什麼不是Array()。

TIA關於JavaScript object.constructor屬性的問題

+1

var data = new Array(1,2,3); console.log(data.constructor);'show me'函數Array(){[native code]}'。你在使用哪個平臺?見下面[小提琴](http://jsfiddle.net/t8XVS/)。 – 2012-07-27 18:57:04

+0

嗯..是的,更混亂。如果我在螢火蟲控制檯中嘗試相同的代碼,它會記錄[未定義]。 – Arjun 2012-07-27 19:02:38

+2

@Arjun:不要太依賴控制檯輸出。這是一種解釋,容易出錯和誤解。 – 2012-07-27 19:08:35

回答

3
  1. 是的,你可以手動改寫一個構造函數的prototype對象的.constructor財產。

  2. 看起來constructor屬性已被更改。通常你可能會看到類似function Array() { [native code] }而不是[ undefined ]

有一兩件事可以做,以驗證是...

console.log(typeof [].constructor); 

它應該給你"function"。如果它給你"object",那就改變了。


不要相信控制檯輸出

它從你在Firebug測試評論似乎。

作爲一般規則不要太多的信任控制檯日誌記錄。遊戲機是環境的插件,並且必須解釋它們已被記錄到日誌中。有時候這種解釋是誤導性的。

如果你得到奇怪的結果,然後進行其他試驗...

console.log(Array);   // [ undefined ] ...huh??? 
console.log([].constructor); // [ undefined ] ...huh??? 

typeof [].constructor; // Firebug still gives "function" 

[].constructor === Array; // Firebug returns true 

所以你可以看到,即使螢火蟲給函數本身的一個奇怪的解釋,它不會改變的事實,它仍然是預期的Array構造函數。

0
  1. constructor財產是writable。因此anyObject.constructor可明確設置爲undefinednull(這將在anyObject上創建新財產,並且不會修改prototypeconstructor財產)。您也可以將prototypeconstructor屬性更改爲nullundefined,以便它反映在函數的每個實例上。默認情況下,它永遠不會是nullundefined

  2. 它顯示了我如預期的function Array() { [native code] }。由於您沒有得到相同的結果,因此Array.prototype.constructor已被某些第三方代碼修改。你應該檢查一下。