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:
- Một đối tượng mới được tạo, kế thừa từ foo.prototype .
- 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ố.
- Đố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:
- 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ề
- 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
}
vì từ khóa này không được sử dụng !! – user2580076