new会返回命名函数构造函数实例 - ?

时间:2013-07-21 17:35:17

标签: java javascript jquery

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

var moo = function () {
    return this;
}

如果我执行声明

new foo()

我真的会得到一个moo的例子吗?这似乎既明显又不直观。从功能上来说,这应该是应该发生的事情,但与此同时,如果您不了解内部结构,则不会发生这种情况。

编辑:我意识到这似乎不直观b.c.在Java构造函数中不能返回任何内容。

这与jquery使用的构造函数模式非常相似。

2 个答案:

答案 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(...)时,会发生以下情况:

     
      
  1. 创建一个新对象,继承自foo.prototype。
  2.   
  3. 使用指定的参数调用构造函数foo,并将其绑定到新创建的对象。新foo是   相当于新的foo(),即如果没有指定参数列表,则foo为   无争议地召集。
  4.   
  5. 构造函数返回的对象成为整个新表达式的结果。如果构造函数没有   显式返回一个对象,使用在步骤1中创建的对象   代替。 (通常构造函数不返回值,但它们可以   如果他们想要覆盖正常的对象创建,请选择这样做   过程。)
  6.   

在你的例子中,也创建了一个新的Object,但是没有使用'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:

  1. 构造函数的默认行为是返回'this',如果没有返回任何其他内容
  2. 如果从构造函数返回另一个对象,则绑定到'this'的新创建对象将被丢弃
  3. 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
    }