[英]Can I safely extend javascript builtin classes?
我可以安全地擴展 Javascript 內置類,比如Array
嗎?
即以下瀏覽器/環境將不起作用:
Array.prototype.double = function() { return this.concat(this); }
Array.twice = function(a) { return a.double(); }
Array.twice([1, 2, 3]) # => [1, 2, 3, 1, 2, 3]
取決於你對“工作”的定義。
原型擴展存在三個主要問題。
for .. in
它將像這樣工作, Array.prototype
和Array
是可變的,因此您可以添加代碼並調用屬性。
然而:
Array.prototype.trolls = 42;
for (var k in []) {
alert(k === "trolls");
}
上面是一個例子,它打破for .. in
。 這很容易解決
Object.defineProperty(Array.prototype, "trolls", {
value: ...,
enumerable: false
});
(僅限 ES5。IE<9 中的中斷。不能在傳統引擎中模擬)
或與
for (var k in []) {
if ([].hasOwnProperty(k)) {
alert(k === "trolls");
}
}
出於這些確切的原因,我個人避免自動擴展本地程序。 但是我認為在你的庫中有一個.extendNatives
函數是完全可以接受的,比如pd.extendNatives
安全地,不是真的 - 因為你不能確定你是唯一擴展它們的人,或者你實際上擴展了正確的方法(請參閱原型 - 我上次檢查時,它擴展了內置類,這造成了嚴重破壞其他腳本對內置行為的期望)。 修改你不擁有的對象是一條通往非常棘手領域的道路(“哦,但這是實際內置的concat()
,還是其他一些腳本在我們背后改變了它?”)。
有關更詳細的討論,請參見例如: http : //perfectkills.com/extending-built-in-native-objects-evil-or-not/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.