你是对的,你会得到一个 moo 的实例
之所以如此模棱两可,是因为每当使用 new 关键字时,the newly created object's constructor is not executed until 'this' keyword is used
. 新对象绑定到“this”关键字。
请参考:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
当执行代码 new foo(...) 时,会发生以下情况:
- 创建了一个新对象,继承自 foo.prototype。
- 构造函数 foo 使用指定的参数调用,并且 this 绑定到新创建的对象。new foo 等价于 new foo(),即如果没有指定参数列表,则调用不带参数的 foo。
- 构造函数返回的对象成为整个 new 表达式的结果。如果构造函数没有显式返回对象,则使用在步骤 1 中创建的对象。(通常构造函数不返回值,但如果他们想覆盖正常的对象创建过程,他们可以选择这样做。)
在您的示例中,也创建了一个新对象,但未使用“this”关键字,因此未调用 foo 的构造函数,因此该函数最终返回 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");
}
编辑:回答@Desu 提出的问题
id = 0;
var foo = function(){
}
if(new foo() instanceof foo){
alert("yes"); //alerts yes
}
JavaScript 构造函数 101:
- 构造函数的默认行为是返回 'this' 如果没有返回任何其他内容
- 如果从构造函数返回另一个对象,则绑定到“this”的新创建的对象将被丢弃
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
}