构造函数与其他函数的唯一区别,就在于调用它们的方式不同。不过,构造函数毕竟也是函数,不存在定义构造函数的特殊语法。任何函数,只要通过new操作符来调用,那它就可以作为构造函数,而任何函数,如果不通过new操作符来调用,那它跟普通函数也不会有什么两样。例如,前面例子中定义的Person()函数可以通过下列任何一种方式来调用。
<script type="text/javascript"> function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=function(){LS.log.write(this.name);}; } //当作构造函数使用 var person = new Person("wangzhanchengxu",29,"Software Engineer"); person.sayName(); //作为普通函数调用 Person("LuSheng",30,"PHPer"); window.sayName(); //在另一个对象的作用域中调用 var o = new Object(); Person.call(o,"wangzhanbj",31,"SEOer"); o.sayName(); </script>
这个例子中的前两行代码展示了构造函数的典型用法,即使用new操作符来创建一个新对象。接下来的两行代码展示了不使用new操作符调用Person()会出现什么结果:属性和方法都被添加给window对象了。有读者可能还记得,当在全局作用域中调用一个函数时,this对象总是指向Global对象(在浏览器中就是window对象)。因此,在调用完函数之后,可以通过window对象来调用sayName()方法,并且还返回了"LuSheng"。最后,也可以使用call()或者apply()在某个特殊对象的作用域中调用Person()函数。这里是在对象o的作用域中调用的,因此调用后o就拥有了所有属性和sayName()方法。