2012-08-30 22 views
0

如何操作預定義對象(例如Array)的prototype,以便在創建該對象的實例時執行某些操作?在javascript中設置預定義對象的原型

只要我想要alert('an array was created!')每當一個數組被實例化。

+0

這很棘手,因爲你也可以使用'[123]'創建一個數組。不知道它是否可能。 – pimvdb

+0

這被認爲是一種不好的做法 - 修改內置的類型。 – zerkms

+0

你可以用你自己的一個完全不同的構造函數替換'window.Array',然後繼續實例化一個實際的'Array'(你需要在某處保存,因爲你沒有它在'window.Array')並返回它。儘管如此,這還不是很明智。 – lanzz

回答

2

您可以嘗試用您自己的功能覆蓋Array。它似乎在做new Array時工作,但在做[]時沒有。

(function() { 
    var _ac = Array; 
    Array = function() { 
     alert('an array was newed!'); 
     return _ac.apply(this, arguments); 
    }; 
}()); 

DEMO:http://jsfiddle.net/DAg9A/

+0

[規格](http://es5.github.com/#x11.1.4):'[]'使用'Array',「其中Array是具有該名稱的標準內置構造函數。」。 – pimvdb

+0

請永遠不要這樣做。 – zzzzBov

+2

我從來沒有說過你應該這樣做,但你可以:-) –

3

您可以將它添加到Array.prototype對象所設定的陣列上的一種新方法:

Array.prototype.fizz = function() { 
    alert('works'); 
}; 

var arr = []; 
arr.fizz(); 

然而,這僅僅允許你創建新的方法,這不會讓你擴展現有的方法*也不允許您覆蓋Array構造函數。

小心添加新方法到現有類型。這會對整個腳本環境造成不利影響,並在某些庫中導致意外行爲。雖然有些人可能會將其稱爲「不好的做法」,但使用polyfills進行跨瀏覽器兼容性的情況相當普遍,例如通過創建Array.prototype.indexOf

有作爲「newed」陣列沒有這樣的事時,該單詞「實例化」:

var a1, a2; 
a1 = []; //a1 was instantiated with a new Array 
a2 = new Array(); //a2 was also instantiated with a new Array 

沒有跨瀏覽器裝置重寫Array構造。

*有可能將一個現有的方法封裝在一個函數中,以便在被調用時,除了新的功能外,現有的方法執行其原始功能。儘管這可能被稱爲,但現有方法延伸了,但實際上它正在創建一種新方法。

1

我建議你只創建一個數組的命名空間爲它:

array = {}; 
array.create = function() { 

    alert("Created an array");  
    return []; 

} 

所以每當你創建你使用一個數組:array.create(); 。

您不應在本例中改變原生功能。您必須負責每個陣列的創建。