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 相关文章推荐
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
Aug 21 Javascript
jQuery动态设置form表单的enctype值(实现代码)
Jul 04 Javascript
ajax与302响应代码测试
Oct 23 Javascript
js获取页面传来参数的方法
Sep 06 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
Aug 26 Javascript
JavaScript识别网页关键字并进行描红的方法
Nov 09 Javascript
jquery限定文本框只能输入数字(整数和小数)
Jan 08 Javascript
AngularJS入门教程之双向绑定详解
Aug 18 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
Jul 18 Javascript
微信小程序数据分析之自定义分析的实现
Aug 17 Javascript
JavaScript定时器使用方法详解
Mar 26 Javascript
Angular8 简单表单验证的实现示例
Jun 03 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中的时间处理
2006/10/09 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
php魔术方法功能与用法实例分析
2016/10/19 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
Javascript小技巧之生成html元素
2014/05/15 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
python为tornado添加recaptcha验证码功能
2014/02/26 Python
Python Web框架Tornado运行和部署
2020/10/19 Python
解决python3 Pycharm上连接数据库时报错的问题
2018/12/03 Python
Python docx库用法示例分析
2019/02/16 Python
Python2与Python3关于字符串编码处理的差别总结
2020/09/07 Python
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
英国著名药妆店:Superdrug
2021/02/13 全球购物
应届毕业生应聘自荐信范文
2014/02/26 职场文书
承诺书怎么写
2014/03/26 职场文书
普通话演讲稿
2014/09/03 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
公司开除员工通知
2015/04/22 职场文书
小学生手册家长意见
2015/06/03 职场文书
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python