尝试创建返回函数的对象?

时间:2015-06-23 20:47:29

标签: javascript oop

我尝试了不同的东西并最终得到了这些代码..

var f1 = function() {
             this.x = 10;
             this.innerf = function() {    console.log(this.x);   }
         }

var of1 = new f1();
of1.innerf();

var f2 = function() {
             return function() {
                 this.x = 10;
                 this.innerf = function() {    console.log(this.x);    }
             }
         }

var of2 = new f2();
of2.innerf(); 

这是投掷错误??! of2.inner不是函数

所以,我的匿名函数将相同的函数体返回给我的变量。 为什么我仍然无法实例化?

3 个答案:

答案 0 :(得分:5)

第一部分返回一个对象,您可以调用innerf方法。

第二部分返回一个函数,如果你调用它,它将返回一个对象。但你没有。

这样可行。调用函数f2()。它的返回值是匿名函数。然后,使用new <return value of f2>(),您可以创建对象的实例。

var f2 = function() {
             return function() {
                 this.x = 10;
                 this.innerf = function() {    console.log(this.x);    }
             }
         }

var of2 = new (f2())();
of2.innerf();

// The two lines above can also be written as:

var of3constructor = f2(); // This returns the inner anonymous function.
var of3 = new of3constructor(); // This creates an instance by invoking the anonymous function.
of3.innerf();

答案 1 :(得分:1)

有效的例子:

直接创建

var f1 = function() {
    this.x = 11;
    this.innerf = function() {    
        console.log(this.x);   
    }
}
var of1 = new f1();
of1.innerf();

从函数返回新对象:

var f2 = function() {
    return new function() {
        this.x = 12;
        this.innerf = function() {    
            console.log(this.x);    
        }
    }
}

var of2 = f2();
of2.innerf(); 

返回对象:

var f3 = function() {
    return {
        x: 13,
        innerf : function() {
            console.log(this.x);
        }
    }
}

var of3 = f3();
of3.innerf(); 

另一个:

var f4 = function() {
    return function() {
         this.x = 10;
         this.innerf = function() {    
             console.log(this.x);    
         }
    }
}

var of4 = new (f2())();
of2.innerf(); 

请记住,当您调用没有“new”关键字的函数时,“this”指向声明函数的对象,在本例中为“window”

答案 2 :(得分:0)

您需要将此函数从内部函数返回到外部函数。您还需要立即运行内部函数。

<强>的jsfiddle: http://jsfiddle.net/5dxybbb5/

var f1 = function() {
             this.x = 10;
             this.innerf = function() {console.log(this.x);}
         }

var of1 = new f1();
of1.innerf();

var f2 = function() {
             return function() {
                 this.x = 10;
                 this.innerf = function() {console.log(this.x);}
                 return this;
             }();
         }

var of2 = new f2();
of2.innerf(); 

这也解释了函数声明后的() What is the (function() { } )() construct in JavaScript?