Lưu ý rằng mẫu mô-đun được cung cấp bởi link Bondye được cung cấp không giữ thuộc tính riêng dụ. Nó hoạt động tuyệt vời cho các thuộc tính chức năng kể từ khi chức năng sẽ không thay đổi cho từng trường hợp nhưng làm việc một chút khó lường đối với tài sản có giá trị như các mã sau minh họa:
var module = (function() {
// private variables and functions
var foo = 'bar';
// constructor
var module = function (name) {
// instance variables
this.name=name;
};
// prototype
module.prototype = {
constructor: module,
something: function() {
// notice we're not using this.foo
console.log("foo in "+this.name+" is:",foo);
foo="new value";
}
};
// return module
return module;
})();
var m1 = new module("m1");
var m2 = new module("m2");
m1.something();// foo in m1 is: bar
m1.something();// foo in m1 is: new value
m2.something();// foo in m2 is: new value
Như bạn có thể thấy trong dòng cuối cùng của mã cả m1 và m2 instance chia sẻ một biến riêng gọi là foo (tất cả các cá thể sẽ trỏ đến cùng một giá trị).
Những gì tôi có thể tạo ra từ other link mà Bondye đăng là khó mô phỏng tính riêng tư trong JavaScript và bạn có thể cân nhắc sử dụng quy ước đặt tên để chỉ ra thuộc tính là riêng tư.Bạn có thể sử dụng một cái gì đó như trình biên dịch đóng cửa google và chú thích mã JS của bạn để chỉ ra các cá nhân; nhưng bằng cách sử dụng trình biên dịch đóng cửa có nhược điểm riêng của nó (thư viện được sử dụng không thể được biên dịch trừ khi Compiler đóng cửa tương thích và mã phải ở định dạng nhất định để được biên dịch trong chế độ nâng cao).
Một tùy chọn khác là loại bỏ hoàn toàn nguyên mẫu (ít nhất là cho mọi thứ sử dụng thuộc tính riêng) và đặt mọi thứ vào nội dung hàm của hàm tạo (hoặc sử dụng hàm trả về đối tượng).
// function returning an object
function makeObj(name){
// private vars:
var foo = "bar";
return {
name:name,
something:function(){
console.log("foo in "+this.name+" is:",foo);
foo="new value";
}
}
}
var m1=makeObj("m1");
var m2=makeObj("m2");
m1.something();// foo in m1 is: bar
m1.something();// foo in m1 is: new value
m2.something();// foo in m2 is: bar
// constructor with everything in the constructor's body:
function Obj(name){
// private vars:
var foo = "bar";
this.name=name;
this.something=function(){
console.log("foo in "+this.name+" is:",foo);
foo="new value";
}
}
Obj.prototype.someOtherFunction=function(){
// anything here can't access the "private" variables
}
var m1=new Obj("m1");
var m2=new Obj("m2");
m1.something();// foo in m1 is: bar
m1.something();// foo in m1 is: new value
m2.something();// foo in m2 is: bar
Một vấn đề nữa bạn có thể gặp phải khi sử dụng các giá trị cá thể riêng là chúng chỉ có thể truy cập trong ví dụ. Khi bạn muốn sao chép một đối tượng và định nghĩa một hàm nhân bản trong đối tượng của bạn để tạo một cá thể mới, bạn phải viết các hàm truy nhập công khai để đặt các giá trị riêng vì bạn không thể đặt chúng trực tiếp như trong Java private fields. Thông tin
Thông tin thêm về sử dụng các hàm constructor ở đây: Prototypical inheritance - writing up
liên kết hữu ích cho bạn: [Chi phí của sự riêng tư] (http://blog.jcoglan.com/2012/01/19/the-cost-of- privacy /) và [Mô-đun mô-đun Javascript] (http://briancray.com/posts/javascript-module-pattern) –
Cảm ơn bài viết thú vị. Nó nhận được của tôi một số điểm, nhưng không trả lời câu hỏi ( – Ph0en1x
Xin lỗi, không thông báo rằng bạn thêm bài viết thứ 2. Cần phải đọc nó cũng có. – Ph0en1x