【问题标题】:Javascript Array prototypeJavascript 数组原型
【发布时间】:2013-04-28 19:04:57
【问题描述】:

既然 Array.prototype 本身是一个数组([])reference here,如果我们必须替换原生原型我们如何放置文字对象而不是我们需要放置文字数组不是吗?

Array.prototype=[]

【问题讨论】:

  • 你不应该替换原生原型,你几乎不应该修改原生原型。
  • “literal”这个词只是描述了用于创建对象的语法。如果你这样做[]new Array(),你会得到同样的结果。所以如果你要这样做,你可以使用任何一种语法......虽然我敢肯定你不会真的想这样做。

标签: javascript


【解决方案1】:

EcmaScript 5,最新版本的 JavaScript,改变了含义

[]

来自

 new Array()

使用原始的 Array 构造函数创建,而不是像早期版本的 JavaScript 那样在范围内查找名称 Array

The EcmaScript 5 specification

11.1.4 数组初始化器

...

产生式 ArrayLiteral : [ Elisionopt ] 评估如下:

  1. 让数组成为创建新对象的结果,就好像通过表达式new Array() 其中Array 是具有该名称的标准内置构造函数。

粗体文本是 EcmaScript 5 中的新内容,表示 [] 的含义不受任何后续对 Array 全局或其成员(包括其原型)的修改的影响。

【讨论】:

    【解决方案2】:

    将新数组分配给Array.prototype 是没有意义的。它通常是一个只读属性,分配会静默失败。

    > a = []
    []
    > a === Array.prototype
    false
    > Array.prototype = a
    []
    > a === Array.prototype
    false
    

    即使分配成功,替换数组也必然会在原始原型就位的情况下创建。因此,原始原型将是新原型对象的[[prototype]],并且所有本机方法仍将在分配后创建的任何数组的原型链中找到。

    如果您想替换(隐藏)Array 的本机实例方法(例如,push),只需将新方法分配给相应的属性即可:

    Array.prototype.push = . . .;
    

    另外,请参阅 this answer 了解如何扩展本机方法(例如 push)。 (除非您只是以某种方式扩展本机方法,否则我无法想象这样的用例不是一件非常糟糕的事情。即便如此......)

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 2017-03-02
      • 2013-05-14
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      相关资源
      最近更新 更多