为了在NodeList对象上执行数组方法(类似于Array),我们每次都需要对Array.prototype进行间接调用。
我们可以做一些事情,以便node_list.slice(0,1)
成为可能吗?
由于NodeList从Object.prototype继承了方法,我实现如下并且有效
完美node_list.slice(0,1)
Object.prototype.slice = function(a,b){ return Array.prototype.slice.call(this,a,b);}
在Object.prototype上实现切片是否有任何缺点?
调用Array.prototype的传统方式:
node_list
[<li> test_list1 </li>, <li> test_list2 </li>]
Object.prototype.toString.call(node_list)
"[object NodeList]"
var content = Array.prototype.slice.call(node_list,0,1)
content
[<li> test_list1 </li>]
Object.prototype.toString.call(content)
"[object Array]"
答案 0 :(得分:2)
出于这个原因扩展Object的原型是一个坏主意 即使您想扩展内置原型,也要减少对必要部分的扩展:
HTMLCollection
NodeList
未在for(.. in ..)
循环中显示的原型方法可以定义如下:
var slicer = { value: Array.prototype.slice };
Object.defineProperty(HTMLCollection.prototype, 'slice', slicer);
Object.defineProperty(NodeList.prototype, 'slice', slicer);
另见:
// Equivalent to the question's code
[].slice.apply(node_list,0,1)
// A method to turn a node_list/HTMLCollection in an array (for later use?)
[].slice.call(node_list);