【问题标题】:Do arrays have no prototype by default?数组默认没有原型吗?
【发布时间】:2011-09-30 00:08:24
【问题描述】:

我希望能够用方法扩充Array.prototype,然后在任何数组上调用它们:

>>> [1, 2, 3].customMethod();

但似乎数组没有原型...?

>>> [1, 2, 3].prototype
undefined

我错过了什么吗?


看来我的实际问题出在其他地方:调用[1, 2, 3].customMethod() 有效,但调用someDomElement.childNodes.customMethod() 失败。 childNodes 不是真正的数组吗?

childNodes.filter is not a function

【问题讨论】:

  • push/pop 等怎么样?您是在实例上分配原型,而不是在 Array 类型上。

标签: javascript arrays methods prototypal-inheritance


【解决方案1】:

prototype 是构造函数的属性,例如Array。所以Array.prototype 存在,但不存在[1, 2, 3].prototypeArray 是构造函数,[1, 2, 3] 是数组。

您正在寻找Object.getPrototypeOf([1, 2, 3])

Object.getPrototypeOf 是一个ECMAScript 5 method,因此可能不会出现在所有浏览器中。在这种情况下,您可以尝试访问__proto__ 属性,即[1, 2, 3].__proto__,这是一个较旧的、非标准的东西,Object.getPrototypeOf 是新的标准版本,或者您可以使用an ES5 shim 来确保无论@987654334支持@,所以也支持Object.getPrototypeOf

【讨论】:

    【解决方案2】:

    看起来您正在使用 DOM NodeList,这与 JavaScript 数组对象不同。

    http://blog.duruk.net/2011/06/19/nodelists-and-arrays-in-javascript/ 应该提供一些见解。

    要从类似数组的对象(例如NodeListarguments 变量)中获取“真正的”javascript 数组,请使用.slice 方法,如下所示:

    var realArray = Array.prototype.slice.call(someDomElement.childNodes);
    realArray.filter()
    

    是的,就像另一个答案所示 - .prototype 对象只是构造函数的属性 - 而不是实例。例如。 Object.prototype 存在,但 ({}).prototype 未定义。

    【讨论】:

    • +1 击败我找到了实际类型的链接 (NodeList)。不过,OP 应该问一个新问题,因为编辑是一个完全不同的问题。
    • slice 期望至少有一个参数,应该是0
    • 等等,我可以省一步:Array.prototype.filter.call(someDomElement.childNodes) :)
    • @FredOverflow 不,Array.prototype.slice.call(someDomElement.childNodes) 工作得很好。如果您不向slice 传递任何额外的参数,它只会复制整个第一个参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多