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 相关文章推荐
兼容FireFox 的 js 日历 支持时间的获取
Mar 04 Javascript
JavaScript学习笔记(十七)js 优化
Feb 04 Javascript
jQuery分组选择器用法实例
Dec 23 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
Aug 13 Javascript
不同js异步函数同步的实现方法
May 28 Javascript
js匿名函数使用&传参(实例)
Sep 08 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
May 27 Javascript
vue.js使用watch监听路由变化的方法
Jul 08 Javascript
Vue作用域插槽slot-scope实例代码
Sep 05 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
Feb 01 Javascript
JS实现继承的几种常用方式示例
Jun 22 Javascript
vue element 中的table动态渲染实现(动态表头)
Nov 21 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中如何同时使用session和cookie来保存用户登录信息
2013/07/05 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
vuex 使用文档小结篇
2018/01/11 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
python3实现基于用户的协同过滤
2018/05/31 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
Python语法分析之字符串格式化
2019/06/13 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
工厂会计员职责
2014/02/06 职场文书
水电工岗位职责
2014/02/12 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
企业宗旨标语
2014/06/10 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
岗位聘任报告
2015/03/02 职场文书
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python
Window server中安装Redis的超详细教程
2021/11/17 Redis
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技
Python echarts实现数据可视化实例详解
2022/03/03 Python