Xét đối tượng mô hình sáng tạo với những đặc tính riêng, một cách để làm là:làm cách nào để tạo mẫu đối tượng Javascript bằng các phương thức và đặc tính riêng tư có thể sử dụng lại?
function MyStack(){
var list = [],
index = 0;
this.push = function(val){
return list[index++] = val;
};
this.pop = function(){// ...}
}
var stack1 = new MyStack(); stack1.push(5);
var stack2 = new MyStack(); stack2.push(11);
Vấn đề với điều này: Mỗi thể hiện của ngăn xếp có nó bản sao riêng của phương pháp 'đẩy' và 'pop'.
Một cách khác để thực hiện các phương pháp xây dựng là:
function MyStack(){
this.list = [];
this.index = 0;
}
MyStack.prototype = {
insert: function(val){
return this.list[this.index++] = val;
},
pop:function(){//...}
}
Vấn đề ở đây: Chúng tôi mất sự riêng tư của danh sách và chỉ mục.
Có cách nào, sao cho chúng tôi có thể có cả hai phương pháp sử dụng lại giữa các trường hợp và quyền riêng tư của các thuộc tính?
Tôi hiểu rằng chúng tôi có thể có điều này cho các phương pháp không hoạt động trên bất kỳ trạng thái nào của đối tượng, nhưng tôi đang nói nhiều hơn về những phương thức hoạt động trên trạng thái đó.
Bạn có thể cung cấp cho mỗi cá thể một ID ngẫu nhiên và lưu trữ các thuộc tính riêng của nó trong một số loại cấu trúc dữ liệu. Nhưng tôi sẽ đề nghị chỉ cần quên đi các thuộc tính privat nếu bạn sử dụng các hàm xây dựng. JavaScript không được xây dựng cho điều đó và mọi cách giải quyết đều có một số bất lợi. –
@FelixKling để cho phép nói rằng chúng tôi có một DS phụ trợ, Giống như {id1: {list: [3,4], currentIndex: 2}, id2: {list: [2,1,4], currentIndex: 3}} .. ngay cả trong MyStack.prototype.insert = function (val) {currState = this.auxiliaryDS [this.id]; this.currState.list.push (val) .. Một lần nữa, nó không thực sự riêng tư. – sbr
Bạn có thể xác định lưu trữ dữ liệu và hàm dựng bên trong một hàm và chỉ hiển thị hàm khởi tạo.Kho dữ liệu sau đó sẽ là riêng tư và không thể truy cập từ bên ngoài. Có, ID sẽ có thể truy cập được, nhưng bạn thậm chí có thể tạo một tên thuộc tính ngẫu nhiên cho điều này nếu bạn muốn làm xáo trộn nó. Như tôi đã nói, JS không được xây dựng cho điều này và bất cứ điều gì bạn làm sẽ là hacky và/hoặc phức tạp. Tài liệu phù hợp là IMO có giá trị hơn. Bạn có thể tìm thấy một vài câu hỏi liên quan tại đây: http://stackoverflow.com/search?q=javascript+private+instance+variables+and+prototype+methods –