Vì tò mò nhưng vẫn không thể tìm thấy câu trả lời cho chủ đề hiệu suất của câu hỏi trên, tôi đã viết ý chính này chính này cho nodejs để kiểm tra cả hiệu suất và độ tin cậy của tất cả các giải pháp được trình bày (và cho điểm).
Tôi đã so sánh thời gian tường tận của việc tạo hàm sao chép và việc thực hiện một bản sao. Kết quả cùng với lỗi xác nhận được bao gồm trong nhận xét của ý chính.
Cộng với hai xu của tôi (dựa trên gợi ý của tác giả):
clone0 cent (nhanh hơn nhưng xấu hơn):
Function.prototype.clone = function() {
var newfun;
eval('newfun=' + this.toString());
for (var key in this)
newfun[key] = this[key];
return newfun;
};
clone4 cent (chậm hơn nhưng đối với những người không thích eval () vì mục đích chỉ được biết đến với họ và tổ tiên của họ):
Function.prototype.clone = function() {
var newfun = new Function('return ' + this.toString())();
for (var key in this)
newfun[key] = this[key];
return newfun;
};
Đối với hiệu suất, nếu eval / new Function chậm hơn giải pháp wrapper (và nó thực sự phụ thuộc vào kích thước thân hàm), nó sẽ cung cấp cho bạn bản sao chức năng trần (và ý tôi là bản sao nông thực sự có thuộc tính nhưng trạng thái không chia sẻ) mà không có lông tơ không cần thiết với các thuộc tính ẩn, các chức năng của trình bao bọc và các vấn đề với ngăn xếp.
Thêm vào đó, luôn có một yếu tố quan trọng mà bạn cần xem xét: càng ít mã, càng ít chỗ mắc lỗi.
Nhược điểm của việc sử dụng hàm eval / new là bản sao và hàm gốc sẽ hoạt động trong các phạm vi khác nhau. Nó sẽ không hoạt động tốt với các hàm đang sử dụng các biến phạm vi. Các giải pháp sử dụng bao gói giống như ràng buộc là không phụ thuộc vào phạm vi.