Không có điều gì là riêng tư trong JS, nhưng bạn có thể chơi với phạm vi bằng cách sử dụng closures.
Ví dụ: trong ví dụ của bạn, bạn không cần phải phơi bày var1
làm tài sản công cộng. Bạn có thể dễ dàng viết lại mã của bạn như sau:
function ctest() {
var var1 = "haha";
this.func1 = function() {
alert(var1);
func2();
alert(var1);
}
var func2 = function() {
var1 = "huhu";
}
}
Bởi vì cả hai func1
và func2
cổ phiếu cùng một phạm vi - chúng được định nghĩa trong cùng chức năng, ctest
- họ có thể truy cập vào các biến tương tự. Tất nhiên trong trường hợp đó, bạn không có var1
được hiển thị, vì vậy: myobj.var1
sẽ là undefined
.
Nếu bạn muốn var1
được tiếp xúc như bất động sản, thì những gì bạn cần là bindfunc2
với trường hợp đối tượng mà bạn đã tạo trong constructor:
function ctest() {
this.var1 = "haha";
this.func1 = function() {
alert(this.var1);
func2();
alert(this.var1);
}
var func2 = function() {
this.var1 = "huhu";
}.bind(this);
}
Nếu không func2
sẽ có một đối tượng bối cảnh khác nhau (this
). Nếu trình duyệt không hỗ trợ bind
và bạn không muốn sử dụng một shim (như thể hiện trong các liên kết ở trên), bạn có thể tận dụng lợi thế của việc đóng cửa một lần nữa:
function ctest() {
this.var1 = "haha";
this.func1 = function() {
alert(this.var1);
func2();
alert(this.var1);
}
var context = this;
var func2 = function() {
context.var1 = "huhu";
}
}
IMVHO ít thanh lịch.
Ngoài ra, không có những thứ như 'riêng tư' ở đây. – Alexander
Điều này 'obj.func1()' nên có lẽ là 'myobj.func1()' – forsvarir
@forsvarir yeah nó nên - tôi cố định nó cho anh ta. – Alnitak