[英]Javascript: hiding prototype methods in for loop?
所以假設我已經向數組 class 添加了一些原型方法:
Array.prototype.containsKey = function(obj) {
for(var key in this)
if (key == obj) return true;
return false;
}
Array.prototype.containsValue = function(obj) {
for(var key in this)
if (this[key] == obj) return true;
return false;
}
然后我創建一個關聯數組並嘗試遍歷它的鍵:
var arr = new Array();
arr['One'] = 1;
arr['Two'] = 2;
arr['Three'] = 3;
for(var key in arr)
alert(key);
這將返回五個項目:
-One -Two -Three -containsKey -containsValue
但我想要(預計?)只有三個。 我接近這個錯誤嗎? 有沒有辦法“隱藏”原型方法? 還是我應該做些不同的事情?
你可以使用JavaScript的hasOwnProperty方法在循環中實現這一點,如下所示:
for(var key in arr) {
if (arr.hasOwnProperty(key)) {
...
}
}
參考: 這個YUI博客文章 。
通過使原型方法不可枚舉,您可以從另一端獲得所需的結果:
Object.defineProperty(Array.prototype, "containsKey", {
enumerable: false,
value: function(obj) {
for(var key in this)
if (key == obj) return true;
return false;
}
});
如果您可以控制方法定義,這通常會更好,特別是如果您無法控制其他人如何調用您的代碼,這是庫代碼開發中的常見假設。
Javascript不像你認為的那樣支持關聯數組。 http://ajaxian.com/archives/javascript-associative-arrays-considered-harmful
for(var i in ..獲取對象的所有屬性(數組只是另一個對象),這就是為什么你會看到你原型化的其他對象的原因。
正如文章建議你應該使用一個對象:
var assoc = {'One' : 1, 'Two' : 2};
assoc['Three'] = 3;
for(var key in assoc)
alert(key+' => '+assoc[key]);
你可以這樣做:
for(var key in arr)
{
if (typeof(arr[key]) == "function")
continue;
alert(key);
}
但那是一種偽劣的解決方法
方法1 :使用Object.keys (不返回原型屬性)和循環
Object.keys(arr); // ['One', 'Two', 'Three']
Object.keys(arr).forEach(key => console.log(key))
方法2 :在for循環中使用hasOwnProperty 。
for(var key in arr) {
if (arr.hasOwnProperty(key)) {
...
}
}
對於JavaScript數組的高性能迭代,請使用for
或while
循環。 Nicholas Zakas在他的Tech Talk 加速你的JavaScript中討論了迭代數組的最高性能選項。
你最好的選擇可能是這樣的:
for (var i = collection.length - 1; i >= 0; i--) {
if (obj == collection[i]) return true;
}
由於以下幾個原因,這種方法最好:
length
屬性僅在循環初始化時訪問一次 i >= 0
)進行比較,而不是與另一個變量進行比較 您可以像這樣從 for-in 循環中隱藏添加到原型的方法:
Object.defineProperty(Array.prototype, "containsKey", { enumerable: false });
就在你添加方法之后。 其中“containsKey”是您添加的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.