博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js方法call和apply实例解析
阅读量:6272 次
发布时间:2019-06-22

本文共 2067 字,大约阅读时间需要 6 分钟。

在js编程中实现继承时 用到了两个很特殊的方法,call和apply。

在ECMAScript v3中,给Function原型定义了这两个方法,这两个方法的作用都是一样的:使用这两个方法可以像调用其他对象方法一样调用函数,这句话是从书上抄的,至少我是没读明白这是什么意思。

下面说简单易懂的,先看段代码:

function Introduce(name,age) { document.write("My name is "+name+".I am "+age); } var p=new People(); Introduce.call(p,"Windking",20);

就说上面的这段代码,用了call之后,Introduce就成了p的方法,不知道这样说你明白了么?

使用了call方法,上述的代码就等同于了这个代码:

function People(name,age) { this.name=name; this.age=age; this.Introduce=function(){ document.write("My name is "+name+".I am "+age); }; }

明白意思了么?也是一样的作用。 

好,我们不管这个方法到底能在实际中用到什么,先讲语法。

call接受至少一个参数,call的第一个参数是指你所需要的对象,比如说上面的那个例子,Introduce方法希望他能够被对象p所调用,那么就把p作为call的第一个参数。剩余的参数个数是任意的,作用是作为Introduce方法的参数。顺序按照Introduce参数声明的顺序。比如Introduce.call(p,"Windking",20),假如Introduce是p的一个实例方法,那么也就是这样的:p.Introduce("Windking",20)。明白了么?记住,传入参数的顺序要与函数声明参数的顺序保持一致。  www.jbxue.com
了解了call,apply方法就容易理解了,apply和call唯一的区别是call接受至少一个参数,而apply只接受两个参数,第一个参数与call一样,第二个参数是一个带下标的集合,比如说Introduce.call(p,"Windking",20)就可以改写成Introduce.apply(p,["Windking",20])了。这次明白了么?
那究竟这两个方法有什么用呢?如果我们只是为了实现上面的那个功能,把Introduce实现为People的方法不是更好么?

我把应用总结为两条:

1.共享方法。先看代码:

function Introduce(name,age) { document.write("My name is "+name+".I am "+age); }

这是一个自我介绍的方法,现在假设有一个男孩的类,和一个女孩的类(在这里我只是为了演示,在实际中,会用一个People的父类),因为他们的Introduce都是一样的,于是我们就可以共享这个方法。

function Boy() { this.BoyIntroduce=function(){ Introduce.call(this,name,age); }; }

同理,Girl中也是一样,这样的话,我们就可以避免写代码了。其实这个有些牵强,因为我们完全也可以写成:

function Boy() { this.BoyIntroduce=function(){ Introduce(name,age); } }

但是这个时候,我们如果用Apply的话,就看上去简单多了:

function Boy() { this.BoyIntroduce=function(){ Introduce.apply(this,arguments); }; }

是不是简单了很多呢?如果参数很多的话,那么是不是不用再写那么一场串密密麻麻的参数了呢!

2.跨域调用 www.jbxue.com

一个简单的例子(仅为演示,无任何价值):

function Boy(name,age) { this.BoyIntroduce=function(){ document.write("My name is "+name+".I am "+age); } } function Girl(name,age) {}

这是一个Boy和一个Girl类,然后我们写如下的代码:

var b=new Boy("Windking",20); b.BoyIntroduce();

这没有任何异议。假设有一天有一个女孩也希望做一下自我介绍,只是偶然用一下,那么我就没有必要修改Girl类,因为其他的女孩比较害羞,不喜欢自我介绍。那么这个时候我就可以这样。

var g=new Girl("Xuan",22); Introduce.call(g,"Xuan",22);

3,真正用处——继承

下面才是call和apply最广泛的应用,就是用于构造继承。

转载地址:http://vilpa.baihongyu.com/

你可能感兴趣的文章
C++:运算符重载函数之友元运算符重载
查看>>
ANT task之Junit、JunitReport
查看>>
selenium的那些事--运行报错
查看>>
谋求职业发展,是“走”还是“留”
查看>>
SpreadJS 在 Angular2 中支持绑定哪些属性?
查看>>
Lucene 定义
查看>>
硅谷返乡大潮,AI海归大调查:薪酬、发展、故乡情
查看>>
GNU make manual 翻译(八十二)
查看>>
算法学习之顺序结构
查看>>
百度2013年校园招聘题
查看>>
第3章 敏捷项目管理概述
查看>>
设计模式系列-装饰模式
查看>>
Oozie的作用
查看>>
Android -- TabHost、Fragment、状态保存、通信
查看>>
TFS二次开发系列:四、TFS二次开发WorkItem添加和修改、保存
查看>>
一次向svn中增加所有新增文件 svn add all new files【转】
查看>>
云计算-从基础到应用架构系列-云计算的概念
查看>>
How to convert smartform output into pdf?
查看>>
SQL Left Join, Right Join, Inner Join, and Natural Join 各种Join小结
查看>>
粒子滤波概述
查看>>