1. 首先,我们这里把function直接调用时将这个function当做方法来看待,而new function是将function当做类来看待
2. 当把function作为类来使用时,function中的this下的变量都会变成实例化对象的可访问属性,例如function A(){this.x = 1;},则var a = new A();后相当于得到var a = {x:1};this指向这里类生成的对象本身,this.x就相当于将x这个属性暴露出去,而原本function中没有this的都可以看做是私有变量,不能直接访问。
3. function当做方法来看时,即不new,则调用方法时的this指的是这个文件,我们称为文件对象(函数被执行后,文件对象会增加相应属性)。只有return的东西是可以被外部访问的,内部的数据则是被隐蔽的。
4. 对于继承,js中使用prototype来指定类型的原型,即function的原型对象。对于function当做方法来使用则需要将一些需要用到的原型的方法包在返回变量里。而当做类来使用则可以直接用.的形式来访问属性。从这点来说function当做类来表现面向对象的思想用起来要方便的多。
所以综上,如果是严格按照面向对象思想来设计程序,并且牵涉到继承或者大量的对象创建,则需要用到prototype,推荐将function当做类来使用。
ps:其实js的随意有时候是好处,有时候也不好,使用起来会混乱。所以例如function如果当做类时就不要写return了,而如果当做function来用,不要用this(从公有变量角度来说,呈现的效果是一样的,语法上不会有什么问题,但混起来使用会导致程序变得很乱)。