Tôi đang cố gắng hiểu hành vi của JavaScript (hoặc ít nhất là V8) liên quan đến chức năng của hàm tạo.Tại sao hàm xây dựng trả về các đối tượng, nhưng không phải là nguyên thủy trong JavaScript?
Tôi biết, hàm hàm dựng JavaScript sẽ không bao giờ trả về bất kỳ thứ gì (như vậy: undefined
).
Nhưng xem xét JavaScript này:
function Thing() {
return '';
}
var t = new Thing();
console.log(t, typeof t); // => Thing {} "object"
Bây giờ, nếu bạn làm điều này:
function Thing() {
return { hi: '' };
}
var t = new Thing();
console.log(t, typeof t); // => Object {hi: ""} "object"
Và thậm chí:
function Thing() {
this.a = 'a';
return { hi: '' };
}
var t = new Thing();
console.log(t, typeof t); // => Object {hi: ""} "object"
Vì vậy, tại sao một hàm constructor lại Javascript một đối tượng, nhưng không phải là một nguyên thủy, nếu bạn viết loại mã này?
Hành vi này cũng được đề cập trong this SO answer, nhưng không được giải thích. Tôi cũng đã cuộn qua The new Operator một phần của đặc điểm kỹ thuật ECMAScript, và Construct của nó bị cắt, nhưng điều này không được khai sáng.
Bất kỳ gợi ý hoặc kiến thức nào (bằng tiếng Anh đơn giản, vui lòng)?
Đối với một, nó không phải là "sai và xấu" bởi vì nó không làm những gì bạn nghĩ. Và tại sao nó sẽ trở lại nguyên thủy khi nó không phải là một đối tượng nguyên thuỷ? –
Tóm lại: nếu bạn trả về nguyên thủy từ một hàm tạo, nó sẽ bị bỏ qua. Nếu bạn trả về một đối tượng, nó sẽ được sử dụng làm đối tượng kết quả. Điều đó có trả lời câu hỏi không? Hay bạn đang tìm kiếm một lý do cho hành vi này? – deceze
Nó hoạt động theo cách này "bởi vì spec nói như vậy". Tuy nhiên, tôi nghĩ giải thích "tại sao" mà bạn đang tìm kiếm có thể là ý kiến thực sự - bạn cần có câu trả lời cho thấy lý luận của nhóm thiết kế ngôn ngữ, bất kỳ điều gì khác chỉ là ý kiến của ai đó - ví dụ, đây là của tôi: bạn đã gọi là 'new', vì vậy bạn đang mong đợi một đối tượng, có lẽ nhóm thiết kế ngôn ngữ cảm thấy rằng bạn nên luôn luôn nhận được một đối tượng, ngay cả khi hàm trả về nguyên thủy, nhưng tôi không có gì vững chắc để trả về lý luận đó. –