2016-02-29 14 views
5

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)?

+2

Đố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ỷ? –

+3

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

+5

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 đó. –

Trả lời

4

Đó là bởi vì, theo định nghĩa, mục đích của nhà xây dựng được sản xuất đối tượng, không phải nguyên thủy:

4.3.4 constructor

chức năng đối tượng mà tạo ra và initialises đối tượng

Do đó, [[Construct]] nội phương thức (được gọi qua số new operator), kiểm tra loại giá trị được trả lại bởi [[Call]]:

13.2.2 [[Construct]]

  1. Hãy kết quả là kết quả của cách gọi [[Gọi]] tài sản nội bộ của F, cung cấp obj như này giá trị và cung cấp danh sách đối số được chuyển vào [[Construct]] dưới dạng args.
  2. Nếu Type (kết quả) là Đối tượng sau đó trả lại kết quả.
  3. Trả lại obj.

Trong thực tế, đây là một invariant:

[[Xây dựng]]()

  • Các Loại giá trị trả về phải là Object.
+0

Giống như liên kết trong nhận xét của bạn. Tôi không phát hiện ra điều đó. Cảm ơn. Nó không có ý nghĩa nhiều trong quan điểm của tôi - nhưng đây không phải là nơi cho ý kiến ​​:). – BairDev

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