2013-04-28 3 views
0

Depuis Array.prototype lui-même est un tableau ([]) reference here, si nous devons remplacer le prototype natif comment pouvons-nous placer l'objet littéral à la place nous devons placer tableau littéral n'est-ce pas?Javascript Array prototype

Array.prototype=[] 
+1

Vous ne devriez jamais remplacer un prototype natif et vous ne devriez presque jamais modifier un prototype natif. – SLaks

+0

Le mot "littéral" décrit simplement la syntaxe utilisée pour créer l'objet. Si vous faites '[]' ou 'new Array()', vous obtenez la même chose. Donc, si vous deviez le faire, vous pourriez utiliser l'une ou l'autre syntaxe ... bien que je suis sûr que vous ne voudrez pas vraiment le faire. –

Répondre

2

Il n'y a aucun point dans l'attribution d'un nouveau tableau à Array.prototype. C'est généralement une propriété en lecture seule et l'assignation échouera silencieusement.

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

Même si l'assignation devait réussir, le tableau de remplacement aurait nécessairement été créé avec le prototype original en place. Ainsi, le prototype original serait le [[prototype]] du nouvel objet prototype et toutes les méthodes natives seraient toujours trouvées dans la chaîne prototype de tout ensemble créé après l'affectation.

Si vous voulez remplacer (cacher) une méthode d'instance native de Array (par exemple, push), suffit de lui assigner la nouvelle méthode à la propriété appropriée:

Array.prototype.push = . . .; 

Aussi, voir this answer la façon dont vous pourriez prolonger une méthode native (telle que push). (Sauf si vous êtes juste l'extension d'une méthode native d'une certaine façon, je ne peux pas imaginer un cas d'utilisation lorsque cela est autre chose qu'une très mauvaise chose à faire. Même alors ...)

2

EcmaScript 5, la dernière version de JavaScript, a changé le sens de

[] 

de

new Array() 

à créer en utilisant le constructeur Array d'origine au lieu de rechercher le nom Array portée que les versions antérieures de JavaScript fait.

The EcmaScript 5 specification dit

11.1.4 Tableau Initialiser

...

La production ArrayLiteral: [Elision opt] est évaluée comme suit:

  1. Laissez array être la res ul de créer un nouvel objet comme si par l'expression new Array()Array est le constructeur intégré standard avec ce nom.

Le texte est nouveau dans gras EcmaScript 5, et signifie que le sens de [] est pas affectée par les modifications ultérieures des Array mondiales ou de ses membres, y compris son prototype.