JS中call和apply函数用法实例分析


Posted in Javascript onJune 20, 2018

本文实例讲述了JS中call和apply函数用法。分享给大家供大家参考,具体如下:

call 函数

语法

obj.call(thisObj,arg[,arg2[,arg3[,...agr]]]);

简介

thisObj继承obj的属性和方法(obj原型链上的属性和方法不能被继承),后面的参数会当成obj的参数安装顺序传递进去。

示例

function animal(type,nickname){
    this.type = type;
    this.nickname = nickname;
    this.sayHello = function(){
      return 'hello';
    }
}
function cat(name,type,nickname){
    this.name = name;
    //cat继承animal
    animal.call(this,type,nickname);
}
console.log(new cat('wsscat','cut','tom'));
/*
cat {
 name: 'wsscat',
 type: 'cut',
 nickname: 'tom',
 sayHello: [Function] }
*/

apply 函数

语法

obj.apply(this[,argArray]);

简介

apply和call的作用差不多,都可以用来继承,区别在与apply只有两个参数,第二个参数必须是数组或者arguments对象。否则会报TypeError错误。如果继承的对象obj有多个参数,则会吧argArray的参数依次对应obj的每个参数。

示例

function animal(type,nickname){
    this.type = type;
    this.nickname = nickname;
    this.syaHello = function(){
      return 'hello';
    }
}
function cat(name,type,nickname){
    this.name = name;
    animal.apply(this,arguments);
}
console.log(new cat('wsscat','cut','tom'));
/*
cat {
 name: 'wsscat',
 type: 'wsscat',
 nickname: 'cut',
 syaHello: [Function] }
*/

总结

callapply功能是相同的

相同点在于都是用于对象的继承,第一个参数都是thisObj.

不同点在于call可以有多个参数,从第二个参数开始往后的参数会依次传给被继承的对象做参数。apply只有两个参数,第二个参数必须是数组类型或者arguments对象类型,而且他会把数组中的元素依次传递给被继承的对象做参数。

通过以上几点,我们可以得到如果被继承的对象只有一个参数的可以使用call,如果被继承的对象有多个参数的,建议使用apply.

补充

js中可以实现多继承,只需要调用多次call或apply即可。如:

function animal(type,nickname){
    this.type = type;
    this.nickname = nickname;
    this.syaHello = function(){
      return 'hello';
    }
}
function wscat(name,age){
    this.name = name;
    this.age = age;
    this.sayMe = function(){
      return 'my name:' + this.name + ', age:' + this.age;
    }
}
function cat(name,age,type,nickname){
    //第一种使用call
    animal.call(this,type,nickname);
    wscat.call(this,name,age);
    //第二种使用apply
    //animal.apply(this,[type,nickname]);
    //wscat.apply(this,[name,age]);
}
console.log(new cat('wscat',2,'cat','tom');
/*
cat {
 type: 'cat',
 nickname: 'tom',
 syaHello: [Function],
 name: 'wscat',
 age: 2,
 sayMe: [Function] }
*/

继承的优化

如果构造函数this绑定了太多的属性(比如一些共用的函数),示例化后就会照成浪费(因为this里的属性和方法实例化后会复制一份给新对象,多个对象之间的属性和方法互不干涉,对于一些可以共用的方法来就会造成浪费)

所以我们一般把共用的函数都放在原型链(prototype)上。但是使用call和apply无法继承原型链上的属性和方法。

因此我们可以使用混合的而写法,使用原型链和(applycall)组合的方式进行继承。

让子的原型链指向父的示例(父的实例化对象)。如:

cat.prototype = new animal();

让父的属性创建在子的this上。如:

animal.call(this[,arg]);
//animal.apply(this[,argArray]);

具体代码如下:

function animal(type,nickname){
    this.type = type;
    this.nickname = nickname;
}
animal.prototype.sayHello = function(){
    return 'hello';
}
function wscat(name,age){
    this.name = name;
    this.age = age;
} 
//这里是关键,原型链只能单继承,
//不能同时继承多个原型链,所以要一级一级来。
wscat.prototype = new animal();
wscat.prototype.sayMe = function(){
    return 'my name:' + this.name + ', age:' + this.age;
}
function cat(name,age,type,nickname){
    animal.call(this,type,nickname);
    wscat.call(this,name,age);
}
cat.prototype = new wscat();
var obj = new cat('wscat',10,'cat','tom');
console.log(obj);
//animal { type: 'cat', nickname: 'tom', name: 'wscat', age: 10 }
console.log(obj.sayHello());//hello
console.log(obj.sayMe());
/*
    my name:wscat, age:10
*/

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
读jQuery之十三 添加事件和删除事件的核心方法
Aug 23 Javascript
js 浏览本地文件夹系统示例代码
Oct 24 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
Dec 25 Javascript
MUI  Scroll插件的使用详解
Apr 13 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
Aug 02 Javascript
详解redux异步操作实践
Aug 15 Javascript
Vuex的初探与实战小结
Nov 26 Javascript
微信小程序自定义组件实现环形进度条
Nov 17 Javascript
Vue 实现分页与输入框关键字筛选功能
Jan 02 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
May 07 Javascript
原生js实现日期选择插件
May 21 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
Jun 08 Javascript
微信小程序模拟cookie的实现
Jun 20 #Javascript
JS伪继承prototype实现方法示例
Jun 20 #Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 #jQuery
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
Jun 19 #Javascript
Vue兼容ie9的问题全面解决方案
Jun 19 #Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
Jun 19 #Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
Jun 19 #Javascript
You might like
PHP 的 __FILE__ 常量
2007/01/15 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
JavaScript中的逻辑判断符&&、||与!介绍
2014/12/31 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
JavaScript简单计算人的年龄示例
2017/04/15 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
使用elementUI实现将图片上传到本地的示例
2018/09/04 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
举例讲解Python中is和id的用法
2015/04/03 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
python线程中同步锁详解
2018/04/27 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
python爬虫之遍历单个域名
2019/11/20 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
建筑设计师岗位职责
2013/11/18 职场文书
路政管理专业个人自荐信范文
2013/11/30 职场文书
2014年体育工作总结
2014/11/24 职场文书
申报优秀教师材料
2014/12/16 职场文书
三行辞职书范文
2015/02/26 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL