这篇来针对俩个问题 进行现阶段总结
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));