这篇来针对俩个问题  进行现阶段总结

1) prototype 是什么玩意

我认为 prototype  原型~ 就是实现共用 参数或者 默认参数 可以用

举个栗子

function ClassA()
{
ClassA.prototype.name='xiaoming';
ClassA.prototype.age='18';
}

var p = new ClassA();
alert(p.name);//没赋值直接调取原型 输出xiaoming
var p2 = new ClassA();
p2.name='xiaowang'// 实体赋值了
alert(p2.name);// 输出 xiaowang

delete p2.name;//删除 实体赋值
alert(p2.name);//输出xiaoming

在举个array 栗子 并换了一个姿势

function ClassA()
{

}

ClassA.prototype={name:'xiaoming', age : '18',list:['帅','富']};

var p = new ClassA();
p.list.push('矮');
alert(p.list); // 输出 帅 富 矮
var p2 = new ClassA();

alert(p2.list);// 输出 帅 富 矮

p2.list=['高','白','丑'];
alert(p2.list); // 输出 高 白 丑

 2)Function 什么时候用new 什么时候不用?(个人的一些理解)

因为JAVAscript里没有类和方法的概念  统一为Function来实现 所以 New一个函数 和直接调用函数 就是方法与类的区别 比如
我们想象下面是一个类

function test ()
{
this.name='test';
this.age='18';
this.meth = function()
{alert('方法'); };

}
var tt1 = new test();//new 一个对象
var tt2 = test();//直接调用

alert(tt1.name);// 回返回 Test
alert(tt2.age);//会报错

tt1.meth();// 弹出带有‘方法’提示框;
tt2.meth(); // 报错

方法:

加上return 之后 马上就有方法的感觉~  定义了一个方法体 返回参数 age

function test ()
{
this.name='test';
this.age='18';
return age;

}
var tt2 = test();
alert(tt2);//返回了一个 18;

function  就暂时就这么理解 
引用一句话:(别蒙 就是留着以后深入思考的时候拿来提示 知道就行了)
如果函数返回值为常规意义上的值类型(Number、String、Boolean)时,new函数将会返回一个该函数的实例对象,
而如果函数返回一个引用类型(Object、Array、Function),则new函数与直接调用函数产生的结果等同

3)理解fuction面对对象 的话 一定会接触call和apply  在这里一起解释

call和apply 

Function的方法 功能是一样的 不过参数不同 

Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function(args-->arguments)

Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表

举个栗子 
从 ____chen的博客里抄来的 本家姓 一样的优秀

<script type="text/javascript">  
/*定义一个人类*/
function Person(name,age)
{
this.name=name;
this.age=age;
}
/*定义一个学生类*/
functionStudent(name,age,grade)
{
Person.apply(this,arguments);
this.grade=grade;
}
//创建一个学生类
var student=new Student("zhangsan",21,"一年级");
//测试
alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);
//大家可以看到测试结果name:zhangsan age:21 grade:一年级
//学生类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处.
</script>

分析: Person.apply(this,arguments);

this:在创建对象在这个时候代表的是student

arguments:是一个数组,也就是[“zhangsan”,”21”,”一年级”];

                   也就是通俗一点讲就是:用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就将属性创建到了student对象里面

2.        call示例

在Studen函数里面可以将apply中修改成如下:

Person.call(this,name,age);

这样就ok了

3.        什么情况下用apply,什么情况下用call

在给对象参数的情况下,如果参数的形式是数组的时候,
比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply ,
 如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),
这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade));