废话
道听途说,一直以为Js是很弱智的,于是就没有学,直接进项目,随便看了两天就用起来了,结果还真是的,一个复杂的前台页面写下来,1500多行的Js以为自己差不多了,这几天看了一下2048的源码,看到人家写的漂亮而严谨,用到一些简洁的方法我完全不懂,就了解了下,才知道Js只是入手快而已,其灵活多变,驾驭的好而优雅并不比JAVA和C#简单....所以我决定系统地过一遍Js,本文不过是个开头.
Js里面有一个call的方法很有意思.
定义
文档中是这样写的:
call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
如果没有实际的例子,没有办法知道这个奇葩的方法有什么用.我在看了下面这段代码产生了这个想法:
var Add=function(a,b)
{
console.info(a+b);
}
var Sub=function(a,b)
{
console.info(a-b);
}
Add.call(Sub,3,3);//它输出6:用Add对象替换Sub对象来执行方法.
要是这样直接用Add(3,3);不就OK了吗?
直到我看到下面的例子我才明白:
function Sister()
{
this.age=18;
this.sayAge= function()
{
document.write("Age:"+this.age);
}
this.yaya=function()
{
document.write("yaya.....");
}
}
function Brother()
{
this.age=25;
this.sayAge=function(){
document.write("Age:"+this.age);
}
this.hoho=function()
{
document.write("hoho.....")
}
}
var sis=new Sister();
var bro=new Brother();
sis.sayAge.call(bro);
它输出的是 Age:25,其实到这里我还很迷糊,下面这一个断点调试才让我明白,
我在第26行打了断点,然后单步了一步.
sis.sayAge.call(bro)调用的方法确实是Sister中的方法,但是其中的this(上下文)却变成了Brother.用文档中的解释就是:只有这个sayAge是sis对象的,其执行环境却是bro的.
简而言之:sis.sayAge.call(bro)意思就是,单单将sis的sayAge移动到bro对象中来执行.
ps:要是我设计的js,我就规定这么写:sis.sayAge.in(bro)