Phương pháp mở rộng khá phổ biến trong các thư viện JavaScript và thường là phương pháp cho phép mã tiêu thụ thêm tất cả thuộc tính và phương thức "sở hữu" của một hoặc nhiều đối tượng vào đối tượng đích. Mã này thường khá đơn giản: lặp qua tất cả các khóa của mỗi đối số vượt quá đầu tiên và sao chép giá trị được lưu trữ ở đó vào đối số đầu tiên.
"Mixin" dùng để chỉ mẫu thiết kế mà bạn sử dụng một đối tượng làm loại vùng chứa cho một tập hợp thuộc tính và phương pháp cụ thể mà bạn muốn chia sẻ trên nhiều đối tượng trong hệ thống của mình. Ví dụ, bạn có thể có các getters và chiều cao và chiều cao có thể áp dụng cho tất cả các thành phần UI trong ứng dụng của bạn và do đó bạn sẽ tạo, trong trường hợp JavaScript, hoặc một hàm có thể được khởi tạo với "new" hoặc giữ các phương pháp này. Sau đó, bạn có thể sử dụng chức năng loại "mở rộng" để sao chép các phương thức này vào bất kỳ số lượng đối tượng nào trong hệ thống của bạn.
Dấu gạch dưới có phương thức mixin về bản chất chỉ là phần mở rộng trong đó tất cả các phương thức được truyền vào đối tượng được thêm vào đối tượng gạch dưới cơ sở để sử dụng trong chuỗi. jQuery thực hiện một điều tương tự với phương thức mở rộng của jQuery.fn.
Cá nhân tôi muốn tiếp tục mở rộng như một hành vi kiểu "sao chép tất cả mọi thứ từ những đối tượng này sang đối tượng này" trong khi có phương thức mixin riêng thay vì chỉ chấp nhận một đối tượng nguồn và sau đó xử lý tất cả đối số khác làm tên của thuộc tính và các phương thức để sao chép (nếu chỉ có mục tiêu và nguồn được truyền vào mà không có đối số nữa thì nó chỉ hoạt động như một nguồn mở rộng).
ví dụ:
function mixin(target, source) {
function copyProperty(key) {
target[key] = source[key];
}
if (arguments.length > 2) {
// If there are arguments beyond target and source then treat them as
// keys of the specific properties/methods that should be copied over.
Array.prototype.slice.call(arguments, 2).forEach(copyProperty);
} else {
// Otherwise copy all properties/methods from the source to the target.
Object.keys(source).forEach(copyProperty);
}
}
Câu trả lời này khá cụ thể đối với Ext.js và không áp dụng được cho nhiều thư viện JavaScript khác (jQuery và Underscore chỉ là hai ví dụ). – natlee75
@ natlee75 Câu trả lời của tôi nói rằng mixins không sử dụng chuỗi nguyên mẫu, và nó không kiểm tra 'instanceof', Ext-JS là một trong những thực thi của chúng (chúng cho phép bạn kiểm tra xem một cái gì đó là mixin theo một cách khác). Theo như tôi biết, jquery hoặc gạch dưới không thực hiện trộn bằng cách đặt chúng trong chuỗi nguyên mẫu (họ chỉ cần sao chép tài sản). Nhận xét của bạn ngụ ý rằng jquery và gạch dưới có thể có mixins hoạt động chính xác với instanceof? Vui lòng giải thích/ –
Không, nhưng chức năng 'mở rộng' của chúng cũng không thực hiện được. Chỉ có "thư viện lớp" (như 'Ext.define') sử dụng thuật ngữ" mở rộng "để thừa kế nguyên mẫu. – Bergi