2012-04-28 4 views
5

Tôi bắt đầu bằng javascript và đặc biệt với mẫu OOP.Getters và setters trong javascript

Câu hỏi của tôi rất đơn giản. Trong một setter, có cách nào để giữ cùng tên cho tham số và biến lớp private? Tôi đã nhìn khắp mọi nơi nhưng không thể tìm thấy ai đề cập đến nó, chỉ là những ví dụ với các tên khác nhau. Tôi rất cầu kỳ với mã của mình và tôi phải cho nó hai cái tên khác nhau.

Lấy ví dụ từ http://ejohn.org/blog/javascript-getters-and-setters/

function Field(val){ 
    this.value = val; 
} 
Field.prototype = { 
    get value(){ 
     return this._value; 
    }, 
    set value(val){ 
     this._value = val; 
    } 
}; 

bạn có thể nhìn thấy trong setter tham số là val nhưng tài sản thực sự là giá trị. Vì nó là javascript tôi không thể chỉ đơn giản là làm this.value = value vì "this" sẽ làm cho nó công khai. value = value sẽ tham chiếu cả hai tham số (và sẽ rất lạ). Có thực sự không có cách nào để làm điều này? Nếu không, có bất kỳ "thực hành tốt nhất" cho tình huống này? Tôi đoán dấu gạch dưới có thể hợp lệ nhưng tôi chỉ cầu kỳ nên chỉ muốn đảm bảo không có cách nào khác.

Cảm ơn bạn!

Trả lời

5

Bạn có thể sử dụng đóng để ẩn biến.

function MyClass { 
    var value; 

    this.getValue = function() { 
    return value; 
    } 

    this.setValue = function(val) { 
    value = val; 
    } 

} 

Sau khi các nhà xây dựng MyClass kết thúc, trường value là unacessible, vì nó đã được scoped chỉ để constructor này (chức năng). Vì vậy, chúng tôi có thể nói rằng value là một trường riêng tư. Tuy nhiên, các phương thức getValue()setValue() có thể truy cập công khai từ đối tượng được xây dựng và chúng giữ tham chiếu đến phạm vi biến của MyClass, do đó chúng vẫn có thể thao tác value.

+0

Nguyên mẫu rất đẹp và nhanh. –

+0

Đóng cửa rất thú vị, cảm ơn! Tuy nhiên, câu hỏi đặt ra là sử dụng cùng tên biến trong setter cho tham số và lớp var nhưng trong ví dụ bạn vẫn phải sử dụng các biến khác nhau. Tôi đang khóa cho một cách để sử dụng cùng một tên cho cả hai nếu nó là posible. Một cái gì đó giống như trong java sẽ là biến this.variable (cả hai được gọi là biến nhưng cái đầu tiên đề cập đến biến lớp và biến thứ hai đến tham số – yowie

+0

@AlexWayne Chắc chắn, nhưng bạn không thể khai báo biến "ẩn" trong nguyên mẫu ... ở đây, mẹo là một hàm tạo là một hàm, có một phạm vi biến đổi còn lại trong bộ nhớ sau khi hàm xong, một nguyên mẫu chỉ là một đối tượng, các nguyên mẫu nhanh như thế nào? không phải thời gian – Imp

1

Sử dụng đóng cửa:

(function(exports){ 

    exports.field = {}; 
    var _value = '123'; 

    exports.field.get = function(){ 
     return _value; 
    } 

    exports.field.set = function(val){ 
     _value = val; 
    } 

})(window); 

console.log(field.get()); 

Đây là một hướng dẫn tốt về closures in JS.