如何操作預定義對象(例如Array
)的prototype
,以便在創建該對象的實例時執行某些操作?在javascript中設置預定義對象的原型
只要我想要alert('an array was created!')
每當一個數組被實例化。
如何操作預定義對象(例如Array
)的prototype
,以便在創建該對象的實例時執行某些操作?在javascript中設置預定義對象的原型
只要我想要alert('an array was created!')
每當一個數組被實例化。
您可以嘗試用您自己的功能覆蓋Array
。它似乎在做new Array
時工作,但在做[]
時沒有。
(function() {
var _ac = Array;
Array = function() {
alert('an array was newed!');
return _ac.apply(this, arguments);
};
}());
您可以將它添加到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
構造。
*有可能將一個現有的方法封裝在一個函數中,以便在被調用時,除了新的功能外,現有的方法執行其原始功能。儘管這可能被稱爲,但現有方法延伸了,但實際上它正在創建一種新方法。
我建議你只創建一個數組的命名空間爲它:
array = {};
array.create = function() {
alert("Created an array");
return [];
}
所以每當你創建你使用一個數組:array.create(); 。
您不應在本例中改變原生功能。您必須負責每個陣列的創建。
這很棘手,因爲你也可以使用'[123]'創建一個數組。不知道它是否可能。 – pimvdb
這被認爲是一種不好的做法 - 修改內置的類型。 – zerkms
你可以用你自己的一個完全不同的構造函數替換'window.Array',然後繼續實例化一個實際的'Array'(你需要在某處保存,因爲你沒有它在'window.Array')並返回它。儘管如此,這還不是很明智。 – lanzz