2012-10-10 48 views
5

我設置的Array原型爲my一個例子,我想book.aa將顯示"aa",但它顯示"undefined",爲什麼呢?謝謝!爲什麼我不能覆蓋`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> 

回答

7

您不能分配到Array.prototype因爲prototypeArray一個只讀屬性。

所以,當你寫

Array.prototype = new my(); 

沒有任何反應。要知道爲什麼,嘗試

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

結果是

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

除非你是在嚴格模式下,分配就會失敗。

這就是爲什麼 - 看看http://jsfiddle.net/5Ysub/ - 如果執行

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

你得到

undefinedbb 

bb作品,因爲你已經分配給真正Array.prototype時創建和設置bb屬性。

這是一件好事,Array.prototype不能被重擊,恕我直言。 :)

0

即使您可能直接重寫Array.prototype,您將失去對所有內置方法的訪問權限,如拼接,切片,推送,移位,彈出,非移位,排序,反向和許多其他...所以這將是可怕的編碼實踐。但是,Ray並未指出,因爲它是隻讀的。

這小小的一段代碼將證明,Array.prototype不能被重寫,因爲sort方法仍將執行:

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

如果要覆蓋Array.prototype原型屬性,你必須在做一個像這樣的一個時間: Array.prototype.aa='aa';

如果你想應用大量的屬性Array.prototype,然後通過循環應用它。下面是我爲你寫的一些代碼,它應該完成你正在做的事情:

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