5

Tôi muốn tạo ra getter/setter phương pháp dyanmically để lấy tài sản cá nhân.Javascript động getter/setter cho tài sản cá nhân

Đây là những gì tôi đã làm.

Trước hết, tôi làm lớp:

function winClass (posX, posY, w, h) { 
    var x = posX || 0; 
    var y = posY || 0; 
    var width = w || 0; 
    var height = h || 0; 
} 

Sau đó, tôi mở rộng winClass với các phương pháp getter/setter, như sau:

winClass.prototype.getX = function() { 
    return x; 
} 

winClass.prototype.setX = function (val) { 
    x = val; 
} 

Và sau đó tôi thử nghiệm:

var win1 = new winClass (10, 10, 100, 100); 
document.write (win1.getX()); 

Nhưng lỗi sau xảy ra khi tôi cố gắng thiết lập phương thức 'getX': 'x không được xác định'. Nó có ý nghĩa bởi vì 'x' không có trong phạm vi winClass nhưng do đó tôi không biết cách thiết lập các phương thức getter/setter động cho các biến riêng.

Bất kỳ ý tưởng nào?

Trả lời

13

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; 
} 
+0

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. –

+0

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

+0

@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

0

Tôi đã chơi đùa với điều này trong vài ngày qua. Tôi sẽ đề nghị xem xét các mô hình mô-đun, nếu bạn chưa có. Có rất nhiều tài nguyên về chủ đề này, nhưng tôi thích bài đăng này hơn. http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

Nó xử lý OOP như các phương pháp/biến công khai/riêng tư rất tốt.

1

có một cái nhìn tại this nó giải thích làm thế nào để viết C# phong cách getters và setters trong JavaScript. Rất mát mẻ

Các vấn đề liên quan