tôi tìm thấy một cái gì đó rất kỳ quặc hôm nay: Nếu bạn tạo đối tượng với một hàm constructor và new
từ khóa, nhưng return
một chức năng từ các nhà xây dựng, nó hoạt động như vậy:Sử dụng 'trở lại' khi tạo đối tượng với 'mới'
- Đối tượng mới được tạo thay vào đó là hàm.
- Đó chức năng mới có thể được gọi như bình thường, tuy nhiên ...
- Nếu bạn duy trì một tham chiếu đến
this
trong hàm constructor, tài liệu tham khảothis
một đối tượng được tạo ra một cách chính xác từ các nhà xây dựng. Đó là những gì bạn dự kiến sẽ được trả lại từnew
.
Dưới đây là một ví dụ:
function Constructor() {
var self = this;
this.name = 'instance';
return function() {
return self;
}
}
Vì vậy, nếu bạn khởi tạo nó như thế này: var instance = new Constructor()
Sau đây sẽ cho kết quả:
typeof instance //returns "function"
typeof instance() //returns "object"
instance() //returns { name: 'instance' }
Vì vậy, tôi đoán tôi có ba câu hỏi sau:
- Điều này có hợp pháp không? k trình duyệt chéo? Nó thực sự tuyệt vời và tôi nghĩ nó có thể được sử dụng theo nhiều cách, nhưng hành vi này có đáng tin cậy không?
- Điều gì xảy ra trong nền gây ra hành vi này?
- (có thể được trả lời bởi 2, nhưng ...) Là đối tượng mới (đối tượng được tham chiếu với 'this') bên trong phiên bản mới, sao cho tất cả đều được khép kín và được dọn sạch bởi bộ thu gom rác?
Thật sai khi trả lại bất kỳ thứ gì từ một hàm tạo, cuối cùng tôi nghe thấy. –