特点:
1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;
5.当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。
6.构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚,将此不完整对象的成员释放(c++)。
不同于其它的主流编程语言,JavaScript的构造函数并不是作为类的一个特定方法存在的;
当任意一个普通函数用于创建一类对象时,它就被称作构造函数,或构造器。
一个函数要作为一个真正意义上的构造函数,需要满足下列条件:
1、 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。
2、 构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。
上文定义的构造函数CO就是一个标准的、简单的构造函数。
<scripttype="text/javascript">functionfun(){alert("good")varage=1this.name='MrS.G'this.method=fun2}functionfun2(){alert("thisisthesecondmethodshow")}functionfun1(){varobj=newfun()alert(obj.name)obj.method()alert(obj.age)}window.onload=fun1</script>在fun1()方法中通过varobj=newfun()创建了一个对象。fun()是一个特殊的函数 构造函数,它和普通的函数有什么区别和联系我将在下边谈论。注意到上边有两种形式定义变量。this.name和varage.其实通过this方式创建的变量叫做对象的成员变量,可以在外部通过对象引用。而varage是一个局部变量(如果放到外层,是一个全局变量)这个变量不能被对象在外部引用(如obj.age)否则是undefine,可以将它看成是一个对象的私有成员变量。接下来看看看构造函数的执行过程。首先执行varobj=newfun()这一步后,记录现场,然后跳到fun()的构造函数中,执行alert("good")跳出对话框。接下来就是创建成员变量了(如java中在堆中创建内存空间,创建栈)。好了fun()执行完了,回到fun1(),执行下去。注意一点,alert(obj.age)是undefine.我现在想知道哪些函数可以new(),哪些不可以new().<scripttype="text/javascript">functionfun2(){alert("thisisthesecondmethodshow")}functionfun1(){varobj=newfun2()alert(obj)alert('ifdisplaytherenoerrothroughthecall')}window.onload=fun1</script>这里functionfun2()是一个函数,但是它是构造函数吗?你可以将它当做一个构造函数。这里会发现fun1()中的alert()可以正常执行。这里可以总结为任何函数都可以new,在js中函数就是对象。但是试想一下这里new有意义吗?fun2()中没有变量,或者都是var定义的变量,那么在外部引用不了。new它干嘛呢?,还不如让fun2()作为全局函数执行好了。这里可以回答本章的要探索的问题了:任何函数都是构造函数,如果通过new就可以得到一个对象。通过函数不同的上下文调用分下面几种:(1).当在一个函数调用之前有new关键字,则上下文为新建的对象;//任何函数可以new创建一个对象(2).当一个函数使用call或者apply调用时,给定的第一个参数即为上下文;//构造方法中可以写成员方法。然后通过对象来调用(3).否则,如果一个函数作为一个对象的属性(obj.func)或者obj['func'])来调用时,它就把该对象作为上下文来运行;//上边newfun2()没意义,直接fun2()调用,这里在全局上下文运行(4)如果与上述几条都不符的话,则函数将在全局上下文中运行。