簡體   English   中英

Javascript:在 for 循環中隱藏原型方法?

[英]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數組的高性能迭代,請使用forwhile循環。 Nicholas Zakas在他的Tech Talk 加速你的JavaScript中討論了迭代數組的最高性能選項。

你最好的選擇可能是這樣的:

for (var i = collection.length - 1; i >= 0; i--) {
  if (obj == collection[i]) return true;
}

由於以下幾個原因,這種方法最好:

  • 僅分配了一個局部變量
  • 集合的length屬性僅在循環初始化時訪問一次
  • 每次迭代時,將local與常量( i >= 0 )進行比較,而不是與另一個變量進行比較

您可以像這樣從 for-in 循環中隱藏添加到原型的方法:

Object.defineProperty(Array.prototype, "containsKey", { enumerable: false });

就在你添加方法之后。 其中“containsKey”是您添加的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM