Chỉ khi tôi nghĩ tôi đã có JS tìm ra, tôi nhận được hung lên về vấn đề này:đối tượng instance và tính năng mà tài liệu tham khảo
function Obj() {
console.log('x: %s, o.x: %s', this.x++, this.o.x++);
}
Obj.prototype.x = 1;
Obj.prototype.o = {x: 1};
dự kiến:
> new Obj
x: 1, o.x: 1
> new Obj
x: 1, o.x: 1
> new Obj
x: 1, o.x: 1
Thực tế:
> new Obj
x: 1, o.x: 1
> new Obj
x: 1, o.x: 2
> new Obj
x: 1, o.x: 3
Vì vậy, có vẻ như nếu một thuộc tính nguyên mẫu là một kiểu tham chiếu, thì nó được chia sẻ trên tất cả các trường hợp, nhưng nếu đó là một kiểu không tham chiếu vi nó được khởi tạo lại cho mỗi trường hợp; để xác nhận giả thuyết này, tôi đã thử nghiệm một vài loại khác, chẳng hạn như string
(hoạt động như number
) và array
(hoạt động như object
).
tôi đã xác định rằng tôi có thể tránh cái bẫy này nếu tôi reinitialize thuộc tính đối tượng trong ctor, như thế này:
function Obj() {
this.o = {x: 1};
}
Mà chỉ có vẻ thực sự không chính thống (mà tôi muốn được yêu cầu tự reinitialize tính nhưng chỉ khi chúng là đối tượng tham chiếu).
Có ai có thể làm sáng tỏ những gì đang xảy ra không?
'(mới Obj) .o === (mới Obj) .o' - thuộc tính [được kế thừa] tất cả trỏ đến cùng một đối tượng, có thuộc tính' x' bạn tăng. – Bergi
* ".. chẳng hạn như chuỗi (hoạt động như số) và mảng (hoạt động như đối tượng) .." * tốt, nguyên thủy được sao chép theo giá trị (chuỗi, số, booleans) trong khi đối tượng (có, 'mảng' là một cũng vậy) được sao chép bằng tham chiếu. Vấn đề là khi bạn sửa đổi thuộc tính 'x' của đối tượng' o', bạn đang sửa đổi tham chiếu đến cùng đối tượng 'o' trong chuỗi nguyên mẫu. –