0

为了在 NodeList 对象(类似数组)上执行数组方法,我们需要每次都对 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 上实现 slice 有什么缺点吗?

调用 Array.prototype 的传统方式:

node_list
[<li>​ test_list1 ​&lt;/li>​, <li>​ test_list2 ​&lt;/li>​]

Object.prototype.toString.call(node_list)
"[object NodeList]"

var content = Array.prototype.slice.call(node_list,0,1)

content
[<li>​ test_list1 ​&lt;/li>​]

Object.prototype.toString.call(content)
"[object Array]"
4

1 回答 1

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);
于 2012-04-08T15:55:24.970 回答