前段时间有位朋友发给我一段js程序里面涉及到call和apply,说实话,以前知道这玩意的基本用法,但是还真没仔细去看看是怎么用的,今天试了一下几个简单的demo,在此记录一下,以防后期给忘了。
先看下面的这个简单的程序。
(function(){
/*
About the method of(call apply)
@author MJGao
@time 2015-01-25
*/
var People = function(name){
this.name = name;
this.getPeoplePro = function(){
alert(this.name);
}
}
var Man = function(name){
this.name = name;
}
var people = new People();
var man = new Man("man");
people.getPeoplePro.call(man,'');
})();
我们发现最后输出的结果为:man
当然people.getPeoplePro.call(man,'');
我们可以改为people.getPeoplePro.apply(man,[]);
也可以。
其实上面的意思就是说:将people里面的此方法赋予man来使用,而call方法是可以接受一个个的参数,而apply是要接受数组形式的参数。
我们通过这个玩意来写一个关于继承的例子。代码如下:
(function(){
/*
About the method of(call apply)
@author MJGao
@time 2015-01-25
*/
var People = function(name,age){
this.age = age;
this.name = name;
this.getPeoplePro = function(){
alert(this.name + ':' + this.age);
}
}
var Man = function(name,age){
People.call(this,name,age);
}
var man = new Man('mjgao',20);
man.getPeoplePro();
})();
我们看到输出的结果为:majgao:20
或者我们可以使用apply的写法:
(function(){
/*
About the method of(call apply)
@author MJGao
@time 2015-01-25
*/
var People = function(name,age){
this.age = age;
this.name = name;
this.getPeoplePro = function(){
alert(this.name + ':' + this.age);
}
}
var Man = function(name,age){
People.apply(this,[name,age]);
}
var man = new Man('mjgao',20);
man.getPeoplePro();
})();
同样可以输出如上的内容。
其实我们还可以将People.apply(this,[name,age])
改为People.apply(this,arguments)
也是一样的。
下面我们就来讲讲关于js中arguments的用法。其实学过java的都知道,java中的main函数需要提供相关的参数,而且我们可以获取到的。
看下面一个小例子。
var People = function(name,age){
alert(arguments.length);
}
var p = new People('mjgao',20);
我们可以看到输出结果为2,其实就是输出参数的个数。
我们也可以来访问其中的参数的值。
var People = function(name,age){
alert(arguments.length);
alert(arguments[0]);
}
var p = new People('mjgao',20);
输出结果为:mjgao.
所以上面apply的例子改为arguments也是可以用的。arguments其实就是一个全局的参数。
写到这里,我还想起js中还有几个有意思的东西,caller和callee。
看几个小demo。
(function(){
/*
About the method of(call apply)
@author MJGao
@time 2015-01-25
*/
function get(name,age){
alert(arguments.callee);
alert(get.caller);
}
function getA(){
get('mjgao','20');
}
getA();
})();
我们会发现get函数中的两个方法第一个会输出get整个代码段,第二个函数会输出getA方法的整个内容,其实callee就是针对于自身而言,而caller是针对于哪些调用了它这个函数来说话的,站的立场就是不一样的。
js其实也是一个很复杂的东西,就看你怎么来用了。其实上述的东西在很多开源项目中基本上很多模块都使用了。后期就要好好来研究这些开源的框架为自己以后打基础。
—————–EOF——————