var foo = function () {
return new moo();
}
var moo = function () {
return this;
}
如果我执行声明
new foo()
我真的会得到一个moo的例子吗?这似乎既明显又不直观。从功能上来说,这应该是应该发生的事情,但与此同时,如果您不了解内部结构,则不会发生这种情况。
编辑:我意识到这似乎不直观b.c.在Java构造函数中不能返回任何内容。这与jquery使用的构造函数模式非常相似。
答案 0 :(得分:3)
是的,你会得到一个moo的例子。
非直观性是因为你可以在javascvipt构造函数中返回除object本身之外的其他东西。这是可能的,因为所有函数实际上都是js中的对象。在像java和c#这样不可能的语言中,构造函数总是返回构造函数所属的对象。您也无法在没有此类语言的新关键字的情况下调用构造函数。
不从构造函数返回任何内容与js中的return this;
相同(假设它使用了构造函数)也会增加一点混乱。
答案 1 :(得分:2)
你是对的,你会得到一个moo的实例
这种含糊不清的原因是因为无论何时使用新关键字, 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,并将其绑定到新创建的对象。新foo是 相当于新的foo(),即如果没有指定参数列表,则foo为 无争议地召集。
- 构造函数返回的对象成为整个新表达式的结果。如果构造函数没有 显式返回一个对象,使用在步骤1中创建的对象 代替。 (通常构造函数不返回值,但它们可以 如果他们想要覆盖正常的对象创建,请选择这样做 过程。)
醇>
在你的例子中,也创建了一个新的Object,但是没有使用'this'关键字,因此没有调用foo的构造函数,因此函数最终会返回moo对象。
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:
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
}