Javascript学习笔记之函数篇(五) : 构造函数
Javascript中的构造函数与其他语言相比也是不同的。任何通过关键字new调用的函数都可以当做构造函数。
在构造函数体内,this指向新创建的对象。如果构造函数体内没有显示的return表达式,那么我们就默认返回this,也就是新建的对象。
functionFoo(){ this.bla=1; } Foo.prototype.test=function(){ console.log(this.bla); }; vartest=newFoo();
上面的代码将Foo作为构造函数进行调用,并将新建对象的原型(__proto__)指向了Foo.prototype。
如果我们在构造函数内定义返回的return表达式,构造函数就会返回整个表达式,但这个返回表达式必须为一个对象。
functionBar(){ return2; } newBar();//anewobject functionTest(){ this.value=2; return{ foo:1 }; } newTest();//thereturnedobject
如果new被省略,那么函数将不能返回一个新的对象。
functionFoo(){ this.bla=1;//getssetontheglobalobject } Foo();//undefined
上面的例子可能在某些场景下也可以运行,但由于Javascript中this的工作机制,这里this将指向全局对象。
工厂模式
为了能够不使用关键字new,构造函数将不得不显示返回一个值。
functionBar(){ varvalue=1; return{ method:function(){ returnvalue; } } } Bar.prototype={ foo:function(){} }; newBar(); Bar();
上例中使不使用new来调用函数Bar达到的效果是一样的,将会返回一个新建的包含method方法的对象,这里实际上就是一个闭包。
这里需要注意一点,newBar()将不会返回Bar.prototype,而是在return表达式内函数method的原型对象。
上例中,使用new与否在功能上是无差异的。
通过工厂模式创建新的对象
我们经常被提醒不要使用new,因为一旦忘记了它的使用将导致错误。
为了创建一个对象,我们更愿意使用工厂模式并在工厂模式内构造一个新的对象。
functionFoo(){ varobj={}; obj.value='blub';
varprivate=2; obj.someMethod=function(value){ this.value=value; }
obj.getPrivate=function(){ returnprivate; } returnobj; }