2013-04-28 55 views
0

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

Array.prototype=[] 
+1

您不应该替换原生原型,而应该几乎不会修改原生原型。 – SLaks 2013-04-28 19:09:14

+0

单词“文字”只是描述了用于创建对象的语法。如果你使用'[]'或'new Array()',你会得到同样的结果。所以,如果你要这样做,你可以使用任何语法......但我相信你不会想要这样做。 – 2013-04-28 19:18:22

回答

2

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

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

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

如果要替换(隐藏)Array本地实例方法(例如,push),只是分配新的方法,以适当的属性:

Array.prototype.push = . . .; 

另外,请参阅this answer如何你可能会延长本地方法(例如push)。 (除非你只是以某种方式扩展本地方法,否则我无法想象一个用例,这是一件非常糟糕的事情,即使......)

2

EcmaScript 5,latest JavaScript的版本,从

new Array() 

改变

[] 

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

The EcmaScript 5 specification

11.1.4阵列初始化剂

...

生产ArrayLiteral:[省音选择]如下评价:

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

的粗体文字是在5的EcmaScript新,并意味着[]含义不受任何后续修改到Array全球或其成员包括其原型。