Bộ thu thập/giải quyết phải nằm trong phạm vi có thể xem các biến riêng tư và phạm vi duy nhất có thể thấy các biến này là nội bộ của hàm tạo. Đó là lý do tại sao các biến này thực sự là riêng tư. Vì vậy, để làm cho setters/getters cho họ, bạn phải đặt các chức năng trong phạm vi đó có thể nhìn thấy chúng. Điều này sẽ hoạt động:
function winClass (posX, posY, w, h) {
var x = posX || 0;
var y = posY || 0;
var width = w || 0;
var height = h || 0;
this.getX = function() {return(x);}
this.setX = function(newX) {x = newX;}
}
var win1 = new winClass (10, 10, 100, 100);
alert(win1.getX()); // alerts 10
Bạn có thể thấy nó hoạt động ở đây: http://jsfiddle.net/jfriend00/hYps2/.
Nếu bạn muốn có một getter generic/setter cho các cá nhân, bạn có thể làm điều đó như thế này:
function winClass (posX, posY, w, h) {
var privates = {};
privates.x = posX || 0;
privates.y = posY || 0;
privates.width = w || 0;
privates.height = h || 0;
this.get = function(item) {return(privates[item]);}
this.set = function(item, val) {privates[item] = val;}
}
var win2 = new winClass(10,10,100,100);
alert(win2.get("x")); // alerts 10
Và, nếu bạn muốn hack xung quanh tính chất cá nhân của các biến mà làm cho không có ý nghĩa với tôi (vì bạn cũng có thể biến chúng thành các biến mẫu chuẩn), bạn có thể làm như sau:
function winClass (posX, posY, w, h) {
var privates = {};
privates.x = posX || 0;
privates.y = posY || 0;
privates.width = w || 0;
privates.height = h || 0;
this.getPrivates = function() {return(privates);}
}
winClass.prototype.getX = function() {
return(this.getPrivates().x);
}
winClass.prototype.setX = function(newX) {
this.getPrivates().x = newX;
}
Ví dụ ở đây: http://jsfiddle.net/jfriend00/EKHFh/.
Tất nhiên, điều này làm hỏng bản chất riêng tư của các biến vì vậy không có bất kỳ điểm nào trong việc thực hiện theo cách này như làm cho chúng biến thường xuyên sẽ dễ dàng hơn và có cùng kiểm soát truy cập.
Và, để hoàn thành, đây là phương pháp biến mẫu bình thường tự do cho phép bạn thêm các phương thức truy cập vào nguyên mẫu, nhưng các biến không phải là riêng tư.
function winClass (posX, posY, w, h) {
this.x = posX || 0;
this.y = posY || 0;
this.width = w || 0;
this.height = h || 0;
}
winClass.prototype.getX = function() {
return(this.x);
}
winClass.prototype.setX = function(newX) {
this.x = newX;
}
Do đó trong Javascript khái niệm 'nguyên mẫu' là một fudge để cố gắng giả vờ rằng nó là hướng đối tượng. –
Nhưng đây là một khai báo tĩnh của getters/setters, không phải động.Tôi cần thêm chúng động vào winClass. – Wilk
@Wilk - xác định "getter động/setter động" và vui lòng mô tả những gì bạn đang cố gắng hoàn thành. – jfriend00