2012-10-10 9 views
5

habe ich den Prototyp Array als Instanz von my, denke ich book.aa"aa" angezeigt wird, aber es zeigt "undefined", warum? Vielen Dank!Warum kann ich den Prototyp von `Array` (` Array.prototype`) nicht überschreiben?

<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> 

Antwort

7

Sie können nicht zu Array.prototype zuweisen, da prototype eine schreibgeschützte Eigenschaft von Array ist. So

, wenn Sie schreiben

Array.prototype = new my(); 

nichts passiert. Um zu sehen, warum, versuchen

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

Das Ergebnis ist

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

Sofern Sie im strikten Modus sind, die Zuordnung leise ausfällt.

Aus diesem Grund - und sehen http://jsfiddle.net/5Ysub/ - wenn Sie

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); 

ausführen Sie erhalten

undefinedbb 

Die bb funktioniert, weil Sie auf die echteArray.prototype zugewiesen haben, wenn Sie erstellt und festgelegt die bb Eigenschaft.

Es ist eine gute Sache, dass Array.prototype kann nicht gebrochen werden, IMHO. :)

0

Auch wenn Sie könnte Überschreibung Array.prototype direkt so, würden Sie den Zugriff auf alle integrierten Methoden wie Spleiß, Scheibe, Schieben, Verschiebung, pop, unshift, Art verlieren, Rückwärts- und viele andere ... Es wäre also eine schreckliche Programmierpraxis. Aber es funktioniert nicht, wie Ray darauf hingewiesen hat, weil es nur gelesen wird.

Dieser winzige Code Stück wird zeigen, dass Array.prototype nicht, weil die Methode sort außer Kraft gesetzt werden noch ausführen:

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

Wenn Sie Prototyp Eigenschaften für Array.prototype außer Kraft setzen möchten, müssen Sie es ein tun bei eine Zeit wie folgt: Array.prototype.aa='aa';

Wenn Sie eine große Anzahl von Eigenschaften auf Array.prototype anwenden möchten, wenden Sie es über eine Schleife an. Hier ist ein Code, den ich für Sie geschrieben habe, der genau das erreichen sollte, was Sie versuchen zu tun:

<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> 
Verwandte Themen