Tôi nghĩ rằng tôi đã hiểu sai cách hoạt động của kế thừa nguyên mẫu Javascript. Cụ thể, các biến nội bộ nguyên mẫu dường như được chia sẻ giữa nhiều đối tượng con khác nhau. Nó là dễ dàng nhất để minh họa với mã:Biến riêng tư trong các mẫu thử được thừa kế
var A = function()
{
var internal = 0;
this.increment = function()
{
return ++internal;
};
};
var B = function() {};
// inherit from A
B.prototype = new A;
x = new B;
y = new B;
$('#hello').text(x.increment() + " - " + y.increment());
này kết quả đầu ra 1 - 2
(thử nghiệm nó trên JSBin), trong khi tôi hoàn toàn mong đợi kết quả được 1 - 1
, vì tôi muốn hai đối tượng riêng biệt.
Làm cách nào để đảm bảo rằng đối tượng A
không phải là đối tượng được chia sẻ giữa nhiều phiên bản B
?
Cập nhật: This article nổi bật một số vấn đề:
Vấn đề là phạm vi mỗi phương pháp sử dụng để tạo ra một biến tư nhân, trong đó hoạt động tốt, cũng là đóng cửa, trong hành động, mà kết quả nếu bạn thay đổi một biến riêng cho một cá thể đối tượng, nó đang được thay đổi cho tất cả. I E. nó giống như một thuộc tính tĩnh riêng tư hơn là một biến riêng tư thực sự. Vì vậy, nếu bạn muốn có một cái gì đó riêng tư, giống như một hằng số ngoài công lập, bất kỳ phương pháp nào ở trên đều tốt, nhưng không phải cho các biến riêng tư thực tế. Biến riêng tư chỉ hoạt động thực sự tốt với các đối tượng singleton trong JavaScript.
Giải pháp: Như mỗi câu trả lời BGerrissen của, thay đổi tuyên bố B
và để lại của nguyên mẫu hoạt động như dự định:
var B = function() { A.apply(this, arguments); };
Nhưng toàn bộ vấn đề ở đây là các chức năng thuộc trong 'A', và được chia sẻ giữa nhiều phụ "lớp"(' b', 'C' và 'D'). Không có khả năng cho các biến riêng tư không tĩnh trong các siêu lớp trong Javascript? –
Một cách phổ biến để biểu thị ý định 'riêng tư' (hay còn gọi là cảnh báo lập trình một cái gì đó đặc biệt đang diễn ra với thuộc tính) là sử dụng dấu gạch dưới làm tiền tố cho tên thuộc tính (ví dụ: obj._privateMember). Mặc dù điều này sẽ làm việc với thừa kế cho chuỗi và số, nó bắt đầu trở nên phức tạp hơn khi sử dụng các đối tượng và mảng làm thuộc tính. – BGerrissen
Tôi không rõ chính xác những gì bạn đang yêu cầu. Bạn có muốn một biến được xác định trong hàm 'A' có sẵn cho các phương thức' B', 'C' và' D' nhưng không ở đâu khác? Cố gắng không nghĩ về những điều trong JavaScript về các tính năng của các ngôn ngữ khác (như Java hoặc C#). JavaScript đơn giản là không có các lớp. Nó có các đối tượng kế thừa các thuộc tính từ các đối tượng khác thông qua một chuỗi nguyên mẫu. –