Array.prototype.slice.call如何在getElementsByClassName的重新创建中工作?

时间:2015-02-11 22:11:22

标签: javascript jquery arrays

我有一段我最理解的代码。我唯一不了解的是Array.prototype.slice.call在这个实例中是如何工作的。

var getElementsByClassName = function(className){
  var elements = $('*').filter(function(index, node){
    // this will basically iterate through all nodes on the
    // DOM and check to see which node matches the className passed in.
    return $(node).hasClass(className);
  });
  // elements is an array of two elements. array[0] seems to be the non-enumerable
  // properties (but it has a length property?) and the other is the element on the dom. 
  // the usage below slices out array[0] and returns array[1], but since both
  // have a length property and numeric indices, why doesn't this usage return
  // both items?
  return Array.prototype.slice.call(elements);
};

我已将评论/问题留在了线上。任何帮助将不胜感激:)。

谢谢, 乙

1 个答案:

答案 0 :(得分:1)

您的代码构建了一个jQuery对象,该对象仅包含具有搜索类的DOM节点。对.slice()的调用只是复制了它。只是

会更简单一些
return elements.get();

会做同样的事情。 (当然,$("." + className)将取代整个事物。)

jQuery对象不是数组。它们是模仿数组,而.slice()方法并不挑剔;只要它正在处理的对象有一个length方法和数字索引属性(jQuery对象都有),就可以了。