2011-08-15 26 views
13

nếu tôi có chức năng như thế này:là RETURN từ constructor cần thiết khi tạo đối tượng với mới

function Apple(){ 
    this.color = "green"; 
    return this; 
} 

Khi tạo đối tượng như thế này:

var my_obj = new Apple(); 

là dòng return this; cần thiết và/hoặc là nó hợp lệ theo tham chiếu ngôn ngữ?

+0

bản sao có thể có của [Giá trị nào mà một hàm tạo có thể quay lại để tránh trả lại điều này?] (Http://stackoverflow.com/questions/1978049/what-values-can-a-constructor-return-to-avoid- trở lại-này) –

Trả lời

16

Không, trả lại this là không cần thiết, nhưng nó hợp lệ. Nếu giá trị trả về là một đối tượng, new sẽ trả về đối tượng đó thay vì đối tượng mới được tạo.

Xem chỉ 11.2.2 và 13.2.2 của ECMAScript 5:

Các nhà điều hành mới gọi là nội bộ [[Xây dựng]] phương pháp trên các nhà xây dựng (thường là một chức năng):

11.2.2 các điều hành mới

việc sản xuất NewExpression: NewExpression mới được đánh giá như sau:

  1. Hãy ref được kết quả của việc đánh giá NewExpression.
  2. Cho phép hàm tạo GetValue (ref).
  3. Nếu loại (hàm tạo) không phải là đối tượng, hãy ném ngoại lệ TypeError.
  4. Nếu hàm tạo không thực hiện phương thức bên trong [[Xây dựng]], hãy ném ngoại lệ TypeError.
  5. Trả về kết quả của việc gọi phương thức bên trong [[Xây dựng]] trên hàm tạo, không cung cấp đối số (nghĩa là, một danh sách đối số trống).

Các [[xây dựng]] phương pháp nội bộ các chức năng được mô tả tại điểm 13.2.2:

13.2.2 [[xây dựng]]

Khi [[Xây dựng ]] phương thức nội bộ cho đối tượng Hàm F được gọi với danh sách đối số có thể trống, các bước sau được thực hiện:

  1. Cho obj b e đối tượng ECMAScript gốc mới được tạo.
  2. Đặt tất cả các phương pháp nội bộ của obj như được chỉ định trong 8.12.
  3. Đặt thuộc tính nội bộ [[Class]] của obj thành "Object".
  4. Đặt thuộc tính nội bộ [[Extensible]] của obj thành true.
  5. Cho phép proto là giá trị gọi thuộc tính bên trong [[Get]] của F với đối số "nguyên mẫu".
  6. Nếu Loại (proto) là Đối tượng, hãy đặt thuộc tính bên trong [[Prototype]] của obj thành proto.
  7. Nếu loại (proto) không phải là đối tượng, hãy đặt thuộc tính bên trong [[Prototype]] của obj thành đối tượng mẫu chuẩn được xây dựng trong đối tượng đối tượng được mô tả trong 15.2.4.
  8. Cho kết quả là kết quả của việc gọi thuộc tính bên trong [[Call]] của F, cung cấp obj làm giá trị này và cung cấp danh sách đối số được chuyển vào [[Construct]] dưới dạng arg.
  9. Nếu loại (kết quả) là đối tượng thì kết quả trả về.
  10. Trả về obj.
2

Không cần thiết.

Hàm sẽ hoàn trả lại Object mới khi được khởi tạo với toán tử new. this sẽ đề cập đến đối tượng mới đó trong ngữ cảnh đó.

Trả về không hợp lệ (chẳng hạn như nguyên thủy hoặc đối tượng không phải mới) sẽ vẫn trả lại tiêu chuẩn this.

Bạn có thể ghi đè bằng cách trả về một đối tượng khác mới.

var a = function() { 
    return new Number(42); 
}, 

b = new a; // typeof b === 'number'. 

jsFiddle.

4

Không cần thiết, người xây dựng sẽ tự động trả về đối tượng mới được tạo.

Về dứt khoát trả lại một giá trị từ constructor trang này có thông tin tốt: JavaScript: Constructor Return Value

Trích:

Nếu một hàm constructor trả về không có gì, null, hoặc bất kỳ nguyên tử giá trị/phi vật thể rồi nói giá trị được bỏ qua và tham chiếu đối tượng mới được tạo sẽ được trả lại cho người gọi. Ví dụ, một giá trị trả về là 0 (không) từ một hàm xây dựng sẽ bị bỏ qua.

... mảnh thứ hai của kỳ diệu lảng tránh để ở trên là khả năng cho một nhà xây dựng để trở lại một, đối tượng có thể tồn tại trước đó cụ thể, chứ không phải là một tham chiếu đến một trường hợp mới. Điều này sẽ cho phép bạn tự quản lý số lượng cá thể thực tế nếu cần; có thể vì lý do nguồn lực hạn chế hoặc không có điều gì.

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