2011-08-22 41 views
6

Đó là một mô hình đối tượng javascript tốt hơn ...Đó là đối tượng javascript tốt hơn mô hình

function dog(name) { 
    this.name = name; 
    this.getName = function() { 
    return this.name; 
    }; 
}; 

HOẶC

function cat(name) { 
    this.name = name; 
}; 
cat.prototype.getName = function() { 
    return this.name; 
}; 

VÀ TẠI SAO?

----- chỉnh sửa

Người này hay người kia có sử dụng nhiều bộ nhớ hơn không?

Có một hay nhiều "CPU" chuyên sâu hơn cái kia không?

Cái nào bền vững hơn?

Loại nào có thể mở rộng hơn?

Điều nào dễ đọc hơn?

Trả lời

2

Chỉ là ý kiến ​​cá nhân ở đây ... nhưng tôi thích ký hiệu kiểu "chó" để có thể bảo trì lâu dài.

Tất cả mã "con chó" vẫn được chứa trong định nghĩa con chó. Hãy tưởng tượng đó là 5 năm sau đó và "người tiếp theo" được hướng dẫn để loại bỏ các tài sản hasTail. Không có vấn đề bao nhiêu đối tượng khác/tài sản/etc. đã được xác định từ bây giờ và sau đó, anh ta sẽ tìm thấy nó trong định nghĩa con chó.

Để so sánh ... hãy tưởng tượng 5 năm sau đó và "anh chàng tiếp theo" được hướng dẫn để xóa thuộc tính hasTail khỏi "con mèo". Anh ta phải quét/grep/ctl + f tệp animals.js cho hasTail và hy vọng anh ta xóa đúng.

+1

Tôi đồng ý với bạn. Nó dễ dàng hơn nhiều để làm theo. Nhưng liệu tính dễ hiểu có phải là một chi phí không? Có nhiều "CPU" chuyên sâu hơn không? –

+0

Câu trả lời của Ricardo giải quyết mối quan tâm đó. Tóm lại, có - có một tác động bộ nhớ để sử dụng phong cách chó nếu bạn mong đợi có nhiều hơn một ví dụ của con chó instantiated. –

7

Tuỳ chọn sang một bên, ví dụ thứ hai là ví dụ "đúng". Trong phần đầu tiên, bạn đang tạo một hàm getName mới cho mọi đối tượng. Trong 2, tất cả các đối tượng được tạo bằng hàm tạo này sẽ chia sẻ nguyên mẫu/getName. Thay đổi nó ở một nơi và nó sẽ thay đổi cho mỗi trường hợp.

Trong những dịp đặc biệt (như chuỗi kế thừa phức tạp), bạn có thể cần phải sử dụng đầu tiên, nhưng phải nhận thức được nhược điểm của nó.

This blog post có thể giúp bạn hiểu được nguyên mẫu thừa kế tốt hơn.

+0

Cảm ơn bạn, đã thêm vào bài đọc của tôi. –

0

Tôi sử dụng ký hiệu cat vì nó không giới thiệu các bao đóng không cần thiết, có thể hơi kém hiệu quả.

Tuy nhiên, tôi chưa bao giờ thử nghiệm chính xác làm thế nào không hiệu quả, và nó có thể không tạo ra nhiều sự khác biệt trong độ tuổi của các công cụ JavaScript siêu tối ưu hóa này.

0

Tôi thích phương thức mèo sử dụng nguyên mẫu.

  1. Tôi không muốn có tất cả các phương pháp của mình thụt lề thêm một cấp bên trong contructor.
  2. Tôi muốn có mã hàm xây dựng chỉ là mã hàm xây dựng chứ không phải là nhiều hàm khác - tôi nghĩ nó giúp bạn dễ dàng nhìn thấy những gì bạn đang tìm kiếm.
  3. Tôi muốn sử dụng mẫu thử nghiệm để tất cả các phương pháp không phải được chỉ định mỗi khi hàm khởi tạo được chạy.Nó cũng dường như với tôi như thế này là lý do tại sao toàn bộ nguyên mẫu tồn tại, vì vậy bạn có thể đặt mọi thứ vào nó rằng các instantiations trong tương lai sẽ kế thừa tự động mà không cần phải chạy mã để gán chúng.
  4. Ngoài ra, nếu bạn muốn kết hợp, bạn có thể lấy tất cả các phương thức từ nguyên mẫu mà không cần phải xây dựng một trong các đối tượng.
  5. Khi bạn bắt đầu phân lớp, tôi thấy sơ đồ nguyên mẫu dễ hiểu hơn nhiều.
  6. Tôi thấy việc tìm kiếm các định nghĩa phương thức dễ dàng hơn vì tất cả chúng đều bao gồm .prototype..
1

Cá nhân tôi thích gói các định nghĩa hàm trong đối tượng (ví dụ: ký hiệu con chó), vì nó giống như một lớp "Java/PHP" hơn. Tuy nhiên, việc sử dụng ký hiệu con chó ít hiệu quả về bộ nhớ hơn vì các chức năng được sao chép mỗi khi một cá thể mới được tạo (xem này article)

+0

Vâng, cuối cùng anh ta tuyên bố rằng: "Đó là sự cân bằng giữa các chỉ số hiệu suất và mã tốt hơn. Những ngày này là, cảm ơn lòng tốt, không phải lúc nào cũng dẫn đầu. Bạn không cần phải chọn giữa hai. Chỉ một thành viên cần các thành viên riêng phải là một phần của hàm xây dựng, tất cả những người khác có thể là một phần của nguyên mẫu. " –

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