2015-01-29 19 views
76

Tôi đang bối rối như những gì các điểm của getters và setters trong ECMAScript 6 lớp học. Mục đích là gì? Dưới đây là một ví dụ tôi đang đề cập đến:Getters và setters cho các lớp ECMAScript 6 là gì?

class Employee { 

    constructor(name) { 
     this._name = name; 
    } 

    doWork() { 
     return `${this._name} is working`; 
    } 

    get name() { 
     return this._name.toUpperCase(); 
    } 

    set name(newName){ 
     if(newName){ 
      this._name = newName; 
     } 
    } 
} 
+0

Nó tương tự như trong C#, nếu bạn tình cờ biết về nó. –

+0

Liên quan: [Đối số sử dụng ES6 getters và setters qua quy ước getProperty/setProperty là gì?] (Http://stackoverflow.com/q/32114468/1048572) – Bergi

+0

Bài viết giải thích tốt về điều này có thể tìm thấy tại: https://coryrylan.com/blog/javascript-es6-class-syntax "Trong lớp của chúng tôi ở trên, chúng tôi có một getter và setter cho thuộc tính tên của chúng tôi. Chúng tôi sử dụng quy ước '_' để tạo trường sao lưu để lưu trữ thuộc tính tên của chúng tôi. điều này mỗi khi có được hoặc thiết lập được gọi là nó sẽ gây ra tràn ngăn xếp "... Nó cũng nói về biến không thực sự là" riêng tư ", nhưng có rất nhiều cách mới để tạo các vars riêng trong các lớp JS; yêu thích của tôi là chỉ sử dụng Typecript, nhưng tôi đã sử dụng cách tiếp cận Symbol quá – webdevinci

Trả lời

83

Những setter và getter phép bạn sử dụng các thuộc tính trực tiếp (không sử dụng các dấu ngoặc đơn)

var emp = new Employee("TruMan1"); 

if (emp.name) { 
    // uses the get method in the background 
} 

emp.name = "New name"; // uses the setter in the background 

này chỉ là để thiết lập và nhận được giá trị của bất động sản.

+1

Ý của bạn là tài sản thay vì thuộc tính? Bit gây nhầm lẫn cho tôi – Krizzu

+0

Mắt tốt, @Krizzu. Các thuộc tính tồn tại trong JavaScript và _completely_ những thứ khác với các thuộc tính. Câu trả lời thực sự ám chỉ đến các thuộc tính chứ không phải thuộc tính. Tôi đã chỉnh sửa câu trả lời. Tôi không nghĩ người trả lời sẽ bận tâm. :) –

+0

Tôi không hoàn toàn chắc chắn điều này thực sự là một lợi thế như vậy, nó bằng cách nào đó giấu khái niệm sử dụng setters/getters. Một khách hàng của một lớp có thể nghĩ rằng nó trực tiếp sử dụng các thuộc tính, nơi nó không phải là người làm việc, nhưng tôi đồng ý nó tuân theo nguyên tắc ẩn thông tin/chi tiết. Có lẽ nếu chúng ta sử dụng điều này do đó nó làm cho việc sử dụng dễ dàng hơn và tôi chỉ phải làm quen với nó nhiều hơn nữa ... –

36

Getters và setters trong ES6 phục vụ cùng một mục đích mà họ làm trong các ngôn ngữ khác ... kể cả ES5. ES5 đã cho phép getters và setters qua Object.defineProperty, mặc dù chúng ít sạch hơn và cồng kềnh hơn để sử dụng.

Hiệu quả, getters và setters cho phép bạn sử dụng ký pháp truy cập thuộc tính tiêu chuẩn để đọc và ghi trong khi vẫn có khả năng tùy chỉnh cách thuộc tính được truy xuất và biến đổi mà không cần phương thức getter và setter rõ ràng.

Trong class Employee ở trên, điều này có nghĩa bạn có thể truy cập vào name bất động sản như thế này:

console.log(someEmployee.name); 

Nó sẽ trông như một truy cập tài sản bình thường, nhưng nó thực sự sẽ gọi toUpperCase vào tên trước trả lại. Tương tự như vậy, làm điều này:

someEmployee.name = null; 

sẽ truy cập vào setter, và nó sẽ không thay đổi nội _name tài sản vì mệnh đề bảo vệ giới thiệu trong setter name 's.

Xem thêm câu hỏi chung Why use getters and setters? để biết thêm thông tin về lý do tại sao có thể sửa đổi chức năng truy cập thành viên là hữu ích.

+0

Giải thích rất rõ ràng. Cảm ơn bạn! –

0

Getters và setters ES6 có động lực khác biệt đáng kể so với các khái niệm tương tự trong Java.

Trong Java, getters và setters cho phép lớp xác định JavaBean. Điểm của getters và setters là nó cho phép bean có một giao diện "trực giao" hoàn toàn từ đó được ngụ ý bởi các trường công khai. Vì vậy, tôi có thể có một "tên" trường không phải là một thuộc tính JavaBean, và tôi có thể có một "địa chỉ" thuộc tính JavaBean không phải là một trường.

Thuộc tính JavaBean cũng "có thể phát hiện" bởi hàng nghìn khung công tác (ví dụ như Hibernate) thông qua phản chiếu Java. Do đó, getters và setters là một phần của một phương thức chuẩn để "phơi bày" các thuộc tính bean.

Getters và setters, là các hàm, cũng có giá trị mà chúng "trừu tượng" triển khai. Nó có thể là một trường hoặc một giá trị được tính toán ("tổng hợp"). Vì vậy, nếu tôi có một thuộc tính bean được gọi là "zipcode", bắt đầu như chuỗi được lưu trữ. Bây giờ giả sử tôi muốn thay đổi nó thành một giá trị được tính từ địa chỉ/thành phố/tiểu bang?

Nếu tôi sử dụng một trường, mã này phá vỡ:

 String zipcode = address.zipcode(); 

Nhưng nếu tôi sử dụng một getter, điều này không phá vỡ:

 String zipcode = address.getZipcode(); 

JavaScript không có bất cứ điều gì như JavaBeans. Cho đến khi tôi đọc, giá trị dự định của GET và SET được giới hạn trong các thuộc tính "tổng hợp" (tính toán) nói trên.

Nhưng nó có phần tốt hơn so với java trong khi Java không cho phép bạn chuyển đổi tương đồng một "trường" thành một phương thức, ES6 GET và SET cho phép điều đó.

Đó là, nếu tôi có:

 var zipcode = address.zipcode; 

Nếu tôi thay đổi mã bưu điện từ là một tài sản đối tượng chuẩn để một getter, các mã trên tại gọi hàm GET.

Lưu ý rằng nếu tôi không bao gồm GET trong định nghĩa, điều này sẽ KHÔNG gọi phương thức GET zipcode. Thay vào đó, nó sẽ chỉ gán mã zip chức năng cho var.

Vì vậy, tôi nghĩ rằng đây là một số khác biệt quan trọng để hiểu betweeen Java và JavaScript ES6 getters và setters.

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