该方法应用于function对象(即function本身或者通过new关键字创建的function实例)
该方法的第一个用途是调用一个对象的一个方法(非常的干巴巴是不是?官方解释往往都不说人话,看下面的例子即可):
function add(a,b){ document.write(a + b); } function sub(a,b){ document.write(a - b); } add.call(sub,3,1);
页面输出结果为:4
所以到这儿可有这样的总结:call方法可以由函数A来调用,调用之后传入若干参数,第一个参数为函数B,第二、三个参数为函数要执行时的参数,call方法执行的结果是函数A替换掉函数B的函数体内容,所以上面的例子执行了相加的运算而不是相减的
这个功能用来干什么?感觉好废的样子有没有?莫慌,有意思的在下面
function Class1(){ this.name = "Sam"; this.showName = function(){ alert(this.name); } } function Class2(){ this.name = "Jack"; }
然后创建一个Class1的实例
var c1 = new Class1(); c1.showName();
页面输出"Sam",没有任何问题
然后再创建一个Class2的实例
var c2 = new Class2(); c1.showName.call(c2);
页面输出"Jack"
这个结果貌似有点惊悚,Class2的实例居然可以通过一个call方法调用Class1的私有方法,不过惊悚过后有没有觉得这个功能和某个javascript里面没有但在其它编程语言中很重要的一个功能很像?
接着往下看
function Class1(){ this.sayHi = function(txt){ alert(txt); } } function Class2(){ Class1.call(this); }
然后创建一个Class1的实例
var c1 = new Class1(); c1.sayHi("hello,Jack");
页面输出"hello,Jack",没有任何问题
然后再创建一个Class2的实例
var c2 = new Class2(); c2.sayHi("hello,Sam");
页面输出"hello,Sam"
代码写到这里,"继承"这个词已经浮出水面,在Class2中加了一句Class1.call(this)就使Class2继承了Class1的属性和方法,javascript就是靠call方法来模拟继承的概念
Class1.call(this);这句代码中的this即是指当前对象就是Class1本身,Class1.call即是用Class1的对象代替当前的Class2对象(网上有的文章叫“对象冒充”),所以Class2的实例拥有了Class1的属性和方法
需要说明的是,我觉得用“替换”这个词不准确,如果Class2同时还拥有自已的属性和方法,那这些属性和方法肯定也是一直存在的,如果用“替换”会让人想到把Class2本身的属性和方法干掉,但暂时想不到更合适的描述,姑且先这样记着
这是最基本的继承,javascript里的继承可不可以更酷一点?看下面代码
function Class1(){ this.sayHi = function(){ alert("hello,world"); } } function Class2(){ Class1.call(this); } function Class3(){ Class2.call(this); }
然后创建一个Class3的实例
var c3 = new Class3(); c3.sayHi();
页面居然输出了"hello,world"!
这样,通过call方法,javascript还实现了江湖上失传已久的多重继承。