2013-07-21 29 views
7
var foo = function() { 
    return new moo(); 
} 

var moo = function() { 
    return this; 
} 

Nếu tôi thực hiện báo cáo kết quảSẽ mới trả về hàm tạo hàm hàm được đặt tên-?

new foo() 

Tôi sẽ thực sự có được một thể hiện của moo? Điều này có vẻ đồng thời rõ ràng và không trực quan. Chức năng, đây là những gì sẽ xảy ra, nhưng đồng thời điều này là không mong đợi nếu bạn không biết internals.

EDIT: Tôi nhận ra điều này có vẻ không trực quan. trong các nhà xây dựng Java không thể trả lại bất cứ điều gì.

Điều này rất giống với mẫu hàm tạo mà jquery sử dụng.

Trả lời

3

Có bạn sẽ nhận được một thể hiện của moo.

không trực quan là vì thực tế là bạn có thể trả lại một cái gì đó khác hơn là đối tượng chính nó trong một constructor javascvipt.Điều này có thể bởi vì tất cả các chức năng trong thực tế các đối tượng trong js. Trong các ngôn ngữ như java và C# không thể, hàm tạo luôn trả về đối tượng mà hàm tạo thuộc về. Bạn cũng không thể gọi contructors mà không có từ khóa mới trong các ngôn ngữ như vậy. Không trả lại bất cứ điều gì từ constructor là cùng một số như return this; trong js điều (giả sử nó được sử dụng một constructor) cũng cho biết thêm một chút để nhầm lẫn.

+0

vì từ khóa này không được sử dụng !! – user2580076

2

Bạn là chính xác bạn sẽ nhận được một thể hiện của moo

Lý do cho điều này là rất mơ hồ là bởi vì bất cứ khi nào từ khóa mới được sử dụng, the newly created object's constructor is not executed until 'this' keyword is used. đối tượng mới được ràng buộc với từ khóa 'this'.

tham khảo này từ: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

Khi foo mới mã (...) được thực thi, những điều sau đây xảy ra:

  1. Một đối tượng mới được tạo, kế thừa từ foo.prototype .
  2. Hàm tạo hàm foo được gọi với các đối số được chỉ định và điều này ràng buộc với đối tượng mới được tạo. foo mới là tương đương với foo mới(), tức là nếu không có danh sách đối số nào được chỉ định, foo là được gọi không có đối số.
  3. Đối tượng được hàm xây dựng trả về trở thành kết quả của toàn bộ biểu thức mới. Nếu hàm khởi tạo không trả về một đối tượng một cách rõ ràng, đối tượng được tạo ở bước 1 được sử dụng để thay thế. (Thông thường nhà xây dựng không trả về một giá trị, nhưng họ có thể chọn làm như vậy nếu họ muốn ghi đè lên các đối tượng bình thường tạo ra quá trình .)

Trong ví dụ của bạn, quá một đối tượng mới được tạo ra nhưng Từ khóa 'this' không được sử dụng và do đó hàm tạo cho foo không được gọi và do đó hàm chỉ kết thúc trả về đối tượng moo.

http://jsfiddle.net/v5aGu/

var foo = function() { 
    return new moo(); 
} 

var moo = function() { 
    return this; 
} 

var myFoo = new foo(2); 
if(myFoo instanceof moo){ 
    alert("moo"); 
} 
if(myFoo instanceof foo){ 
    alert("foo"); 
} 

Edit: để trả lời câu hỏi nêu ra bởi @Desu

id = 0; 

var foo = function(){ 

} 

if(new foo() instanceof foo){ 
alert("yes"); //alerts yes 
} 

Javascript Constructors 101:

  1. Hành vi mặc định của nhà xây dựng là để trở về 'này 'nếu không có gì khác được trả về
  2. Nếu đối tượng khác được trả về từ một nhà xây dựng đối tượng mới được tạo ra ràng buộc để 'này' bị bỏ

http://jsfiddle.net/xQVuX/1/

id = 0; 

var foo = function(){ 
} 

if(new foo() instanceof foo){ 
alert("foo yes"); //alerts foo yes because foo returns this as a default behavior 
} 

var foo2 = function(){ 
    var i=new foo(); 
    return i; 
} 

if(new foo2() instanceof foo2){ 
alert("foo2 yes");// does not alert because foo2 returns another object and the newly created object is discarded 
} 

var foo3 = function(){ 
    this.i = 10; 
} 

if(new foo3() instanceof foo3){ 
    alert("foo3 yes"); // alerts foo3 yes because foo3 returns this as a default behavior 
} 
+0

@stack_temp hiện 'this' trả lời câu hỏi của bạn? – user2580076

+0

[link] (http://jsfiddle.net/xQVuX/) 'hàm tạo của đối tượng mới được tạo không được thực thi cho đến khi 'từ khóa' này được sử dụng' không đúng. bản thân hàm là hàm khởi tạo, nếu nó không được thi hành thì moo mới cũng sẽ không được thực thi. – Desu

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