2012-10-10 14 views
5

puse el prototipo de Array como una instancia de my, creo book.aa mostrará "aa", pero muestra "undefined", ¿por qué? ¡Gracias!¿Por qué no puedo sobrescribir el prototipo de `Array` (` Array.prototype`)?

<html> 
    <head> 
     <title>Array Properties</title> 
     <h2>Array Properties</h2> 
     <script type="text/javascript"> 
      function my() { 
       this.aa = 'aa'; 
      } 
      Array.prototype = new my(); 
      Array.prototype.bb = "bb"; 
      var book = new Array(); 
      book[0] = "War and Peace"; 

     </script> 
    </head> 
    <body bgcolor="lightblue"> 
     <script type="text/javascript"> 
      document.write(book.aa+book.bb); 
     </script> 
    </body> 

    </html> 

Respuesta

7

No se puede asignar a Array.prototype porque prototype es una propiedad de sólo lectura de Array.

Así que cuando se escribe

Array.prototype = new my(); 

no pasa nada. Para ver por qué, intente

JSON.stringify(Object.getOwnPropertyDescriptor(Array, "prototype")) 

El resultado es

"{"value":[],"writable":false,"enumerable":false,"configurable":false}" 

A menos que esté en modo estricto, la asignación error de forma silenciosa.

Por eso - y ver http://jsfiddle.net/5Ysub/ - si se ejecuta

function my() { 
    this.aa = 'aa'; 
} 
Array.prototype = new my(); 
Array.prototype.bb = "bb"; 
var book = new Array(); 
book[0] = "War and Peace"; 
document.write(book.aa+book.bb); 

Se obtiene

undefinedbb 

Los bb obras porque se ha asignado a la verdadera Array.prototype al crear y establecer la propiedad bb.

Es una buena cosa que Array.prototype no puede ser golpeado, en mi humilde opinión. :)

0

Incluso si usted podría anulación Array.prototype directamente de esa manera, se perdería el acceso a todos los métodos incorporados tales como empalmes, rebanada, empuje, desplazamiento, pop, unshift, clasificar, revertir y muchos otros ... Así que sería una terrible práctica de codificación. Pero no funciona como Ray señaló porque es de solo lectura.

Esta pequeña pieza de código demostrará que Array.prototype no puede ser anulado debido a que el método de sort todavía se ejecutará:

<script type="text/javascript"> 
Array.prototype={}; 
var a=new Array(1,4,5,7,8); 
a.sort(); 
alert(a.join(",")); 
</script> 

Si desea anular propiedades prototipo para Array.prototype, hay que hacerlo de uno en uno un tiempo como ese: Array.prototype.aa='aa';

Si desea aplicar una gran cantidad de propiedades a Array.prototype, luego aplicarlo a través de un bucle. Aquí hay un código que escribí para usted que debería lograr exactamente lo que está tratando de hacer:

<script type="text/javascript"> 
function my() 
{ 
    this.aa = 'aa'; 
} 
my.prototype.bb = "bb"; 
var instance = new my(); 
for(var j in instance) 
{ 
    if(instance.hasOwnProperty(j) || j in my.prototype) 
    { 
     Array.prototype[j]=instance[j]; 
    } 
} 

var book=new Array(); 
book[0]="War and Peace"; 
alert(book.aa);//alerts "aa" 
alert(book.bb);//alerts "bb" 
</script> 
Cuestiones relacionadas