2011-12-02 30 views
11

Tôi mới vào CoffeeScript (và khá thiếu kinh nghiệm với JS quá, vì thế xin lỗi nếu điều này là ngây thơ) và tôi đã cố gắng để tạo ra một lớp như sau:CoffeeScript Lớp viên

class Test 
    a: [] 

    make: -> 
     @a.push ['A', 'B', 'C'] 

    getdata: -> 
     output = "" 
     for i in @a 
      output += i 
     output 

b = new Test 
b.make() 

alert(b.getdata()) 


c = new Test 
c.make() 

alert(c.getdata()) 

Kết quả tôi nhận được là: "A, B, C" "A, B, C, A, B, C"

Mặc dù tạo một trường hợp mới của 'Kiểm tra'; mảng được nối thêm và không bị xóa. Tôi làm gì sai ở đây? Tôi có khởi tạo biến thành viên sai không?

+3

Bạn nên xem cách nguyên mẫu hoạt động và xem mã được tạo javascript. Tôi thấy rất nhiều sai lầm này trong coffeescript (ngay cả trong hướng dẫn/cookbooks). Quy tắc tôi sử dụng là chỉ định nghĩa các hàm và các mức tĩnh trong các thành viên lớp (tôi định nghĩa các đặc tính cá thể trong hàm tạo bằng cú pháp @member). Và có nó là kinda khó hiểu cho việc sử dụng từ khóa coffeescript lớp. – Guillaume86

+3

lưu ý phụ: 'getdata: -> @ a.join ('')' – tokland

+0

Cảm ơn Guillaume86 và tokland. Tôi đã học được rất nhiều từ điều này. – Anoop

Trả lời

23

Khi bạn xác định a: [], bạn đang tạo một đối tượng mảng đơn trên nguyên mẫu lớp. Mỗi cá thể của lớp mà bạn tạo sẽ có cùng một đối tượng mảng này. Bất cứ khi nào một cá thể thay đổi giá trị, thay đổi sẽ hiển thị cho tất cả các giá trị khác.

Lưu ý rằng đây chỉ là trường hợp nếu bạn sửa đổi một giá trị, chẳng hạn như bằng cách thêm các mục vào một mảng. Nếu bạn thay thế giá trị, ví dụ bằng cách gán một mảng mới, điều này sẽ chỉ ảnh hưởng đến cá thể hiện tại.

Khi bạn muốn có một tài sản đó là khởi tạo trên cơ sở mỗi thẩm bạn nên xác định nó trong constructor, khi dụ được thực sự tạo:

class Test 
    constructor: -> 
     @a = [] 
     @a.push ['A', 'B', 'C'] 

    getdata: -> 
     output = "" 
     for i in @a 
      output += i 
     output 

b = new Test 

alert(b.getdata()) 


c = new Test 

alert(c.getdata()) 

Try this out và bạn sẽ thấy rằng nó hoạt động như bạn muốn.

+1

Không có thắc mắc mọi người bối rối khi bạn thấy những thứ như thế: http://coffeescriptcookbook.com/chapters/classes_and_objects/chaining – Guillaume86

+0

Cảm ơn! Bây giờ tôi hiểu rồi. Điều gì đã làm tôi bối rối hơn nữa là sự thay đổi/thay thế sự khác biệt trong hành vi. Bây giờ điều đó cũng bị xóa. Cảm ơn đã giúp đỡ. – Anoop

+0

Lời khuyên xấu này cũng được lặp lại ở đây http://arcturo.github.io/library/coffeescript/03_classes.html và tôi gần như rơi vào cùng một cái bẫy. Tôi muốn tài liệu Coffeescript sẽ tư vấn về điều này. – aaron

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