0

由于 Array.prototype 本身在这里是一个数组([]) 引用,如果我们必须替换原生原型,我们如何放置文字对象而不是我们需要放置文字数组不是吗?

Array.prototype=[]
4

2 回答 2

2

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

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

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

如果要替换(隐藏)Array(例如)的本机实例方法push,只需将新方法分配给适当的属性:

Array.prototype.push = . . .;

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

于 2013-04-28T19:12:37.893 回答
2

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

[]

 new Array()

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

EcmaScript 5 规范

11.1.4 数组初始化器

...

产生式 ArrayLiteral : [ Elision opt ]评估如下:

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

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

于 2013-04-28T19:47:51.787 回答