在Object.prototype上为NodeList对象实现Array方法是一个好习惯吗?

时间:2012-04-08 15:49:21

标签: javascript dom

为了在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]"

1 个答案:

答案 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);