Điều với nguyên mẫu, là bạn có thể đọc tất cả các ngày dài từ họ, và nó sẽ không thay đổi cấu trúc cơ bản của những gì đang trỏ đến những gì. Tuy nhiên, lần đầu tiên bạn thực hiện một bài tập, bạn sẽ thay thế, trên ví dụ, thuộc tính đó trỏ đến điều gì.
Trong trường hợp của bạn, bạn đã không thực sự gán lại thuộc tính prototyped, bạn đã điều chỉnh giá trị của cấu trúc bên dưới được tìm thấy tại thuộc tính đó.
Điều này có nghĩa là tất cả các đối tượng chia sẻ nguyên mẫu A thực tế chia sẻ việc thực hiện A. Điều đó có nghĩa là bất kỳ trạng thái nào được thực hiện trong A sẽ được tìm thấy trên tất cả các trường hợp B. Thời điểm bạn thực hiện chuyển nhượng tài sản trên một thể hiện của B, bạn đã thay thế hiệu quả trường hợp đó (và chỉ có cá thể đó) trỏ tới (tôi tin rằng điều này là do thực tế có một tên "thuộc tính" mới trên B bị tấn công trong chuỗi phạm vi, trước đây nó đạt đến việc thực hiện "tên" trên A).
EDIT:
Để cung cấp một ví dụ rõ ràng hơn của whats going on:
B.prototype = new A();
var obj1 = new B();
Bây giờ, lần đầu tiên chúng tôi làm một đọc, intepreter làm điều gì đó như thế này:
obj1.name;
Thông dịch viên: "Tôi cần tên tài sản. Đầu tiên, hãy kiểm tra B. B không có 'tên', vì vậy hãy tiếp tục xuống chuỗi phạm vi. Tiếp theo, A. Aha! A có 'tên', trả về"
Tuy nhiên, khi bạn viết, trình thông dịch không thực sự quan tâm đến thuộc tính được kế thừa.
obj1.name = "Fred";
Interpreter: "Tôi cần phải gán cho 'tên' tài sản tôi trong phạm vi trường hợp này của B, vì vậy gán 'Fred' đến B. Nhưng tôi rời khỏi mọi thứ khác xa hơn xuống. chuỗi phạm vi một mình (ví dụ: A) "
Bây giờ, lần sau khi bạn làm một đọc ...
obj1.name;
Interpreter:". tôi cần 'tên' tài sản Aha trường hợp này của B có tên 'tài sản' đã ngồi trên đó. Chỉ cần trả lại - Tôi không quan tâm đến phần còn lại của chuỗi phạm vi (tức là A.name) "
Vì vậy, lần đầu tiên bạn viết tên, nó chèn nó làm thuộc tính hạng nhất trên cá thể và không quan tâm nữa về những gì trên AAname là vẫn còn ở đó, nó chỉ tiếp tục xuống chuỗi phạm vi và thông dịch viên JS không nhận được điều đó xa trước khi nó tìm thấy những gì nó đang tìm kiếm.
Nếu " tên "có giá trị mặc định trong A (như bạn có, là" A "), sau đó bạn sẽ thấy hành vi này:
B.prototype = new A();
var obj1 = new B();
var obj2 = new B();
obj1.name = "Fred";
alert(obj1.name); // Alerts Fred
alert(obj2.name); // Alerts "A", your original value of A.name
Bây giờ, trong cas e của mảng của bạn, bạn không bao giờ thực sự thay thế danh sách trên chuỗi phạm vi bằng một mảng mới. Những gì bạn đã làm là lấy một handle trên chính mảng đó và thêm một phần tử vào nó. Do đó, tất cả các trường hợp của B bị ảnh hưởng.
Thông dịch viên: "Tôi cần phải có được danh sách 'phù hợp' và thêm yếu tố vào đó. Kiểm tra trường hợp này của ... không, không có thuộc tính 'danh sách'. Tiếp theo trong chuỗi phạm vi: A . Yep, A có 'danh sách', sử dụng Bây giờ, đẩy lên danh sách đó"
này sẽ không là trường hợp nếu bạn đã làm điều này:.
obj1.list = [];
obj1.push(123);
Cảm ơn tất cả các bạn cho lời giải thích. Vì vậy, mặc dù nó nói: B.prototype = new A(); và obj2 = new B(); Thuộc tính "danh sách" của A() không được tạo lại, nó chỉ được tái chế? Dù sao, tôi có thể chấp nhận số phận này :) Vì vậy, cách tốt nhất để có một lớp cơ sở có chứa một mảng là gì? Tôi đang xây dựng một cây và cần một lớp nút chung với trẻ em. – med
Giải thích rất tốt. –