2012-10-10 26 views
5

tôi đặt nguyên mẫu của Array như một thể hiện của my, tôi nghĩ book.aa sẽ hiển thị "aa", nhưng nó sẽ hiển thị "undefined", tại sao? Cảm ơn!Tại sao tôi không thể ghi đè nguyên mẫu của `Mảng` (` 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> 

Trả lời

7

Bạn không thể gán cho Array.prototypeprototype là một tài sản của Array read-only.

Vì vậy, khi bạn viết

Array.prototype = new my(); 

có gì xảy ra. Để xem lý do tại sao, hãy thử

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

Kết quả là

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

Trừ khi bạn đang ở trong chế độ nghiêm ngặt, việc chuyển nhượng âm thầm thất bại.

Đó là lý do tại sao - và xem http://jsfiddle.net/5Ysub/ - nếu bạn thực hiện

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

Bạn nhận được

undefinedbb 

Các bb công trình vì bạn đã gán cho thựcArray.prototype khi bạn đã tạo và thiết lập tài sản bb.

Thật là một điều tốt khi Array.prototype không thể được whacked, IMHO. :)

0

Thậm chí nếu bạn có thể ghi đè lên Array.prototype trực tiếp như vậy, bạn sẽ mất quyền truy cập vào tất cả các phương pháp tích hợp như ghép, cắt, đẩy, shift, pop, unshift, sắp xếp, đảo ngược và nhiều những người khác ... Vì vậy, nó sẽ là thực hành mã hóa khủng khiếp. Nhưng nó không hoạt động như Ray chỉ ra bởi vì nó chỉ đọc.

đang mảnh nhỏ này sẽ chứng minh rằng Array.prototype không thể được ghi đè bởi vì phương pháp sort vẫn sẽ thực hiện:

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

Nếu bạn muốn ghi đè các thuộc tính nguyên mẫu cho Array.prototype, bạn phải làm điều đó một lúc một thời gian như vậy: Array.prototype.aa='aa';

Nếu bạn muốn áp dụng một lượng lớn thuộc tính vào Array.prototype, hãy áp dụng nó qua vòng lặp. Dưới đây là một số mã tôi đã viết cho bạn mà nên thực hiện chính xác những gì bạn đang cố gắng làm:

<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> 
Các vấn đề liên quan