2012-10-10 6 views
5

Ben book.aa"aa" gösterecektir düşünüyorum my bir örneği olarak Array prototipini, ancak ilk başta "undefined" görüntüler, neden? Teşekkürler! prototypeArray salt okunur bir özelliktir çünküNeden 'Array' (`Array.prototype`) prototipinin üzerine yazamıyorum?

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

cevap

7

Sen Array.prototype atayamayacağı.

Yani

Array.prototype = new my(); 

hiçbir şey olmuyor yazarken. deneyin, neden görmek için

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

sonuç Katı modda olmadığı sürece, atama sessizce başarısız

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

olduğunu.

neden oluyor That - Eğer oluştururken gerçekArray.prototype atanmış ve set için reklam

undefinedbb 

bb eser olsun size

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

yürütmek eğer - ve gör http://jsfiddle.net/5Ysub/bb özelliği.

Array.prototype'un, IMHO tarafından vurulmaması iyi bir şeydir. :)

0

bile, doğrudan böyle geçersiz kılma Array.prototype, bu tür unshift, sıralama ters ek yeri, dilim, itme, vardiya, pop ve birçok gibi tüm yerleşik yöntemlere erişim kaybeder olabilir diğerleri ... Bu yüzden korkunç kodlama uygulaması olurdu. Fakat Ray'ın işaret ettiği gibi işe yaramıyor çünkü sadece okunur. ,

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

Eğer Array.prototype için prototip özelliklerini geçersiz istiyorsanız anda sadece birini yapmalısınız:

Bu küçük kod parçası sort yöntemi hala çalıştırır çünkü Array.prototype geçersiz kılınamaz göstereceğiz Böyle bir zaman:Array.prototype.aa='aa';

Array.prototype'a büyük miktarda özellik uygulamak istiyorsanız, bunu bir döngü boyunca uygulayın. İşte tam olarak ne yapmaya çalıştığınızı yazmanız gereken bazı kodlar:

<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> 
İlgili konular