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 相关文章推荐
详解new function(){}和function(){}() 区别分析
Mar 22 Javascript
JQuery 初体验(建议学习jquery)
Apr 25 Javascript
基于jquery的横向滚动条(滑动条)
Feb 24 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
Dec 06 Javascript
再探JavaScript作用域
Sep 24 Javascript
jQuery实现复选框批量选择与反选的方法
Jun 17 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
Dec 03 Javascript
Bootstrap每天必学之导航组件
Apr 25 Javascript
angularJS 如何读写缓冲的方法(推荐)
Aug 06 Javascript
vuex实现购物车的增加减少移除
Jun 28 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
Jul 29 Javascript
uniapp 微信小程序 自定义tabBar 导航
Apr 22 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/07/12 PHP
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
PHP网络操作函数汇总
2015/05/18 PHP
javascript add event remove event
2008/04/07 Javascript
Javascript 自定义类型方法小结
2010/03/02 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
node.js中的socket.io入门实例
2014/04/26 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
2018/08/09 jQuery
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
python实现大量图片重命名
2020/03/23 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
酒店行政人事部经理职务说明书
2014/02/26 职场文书
中班开学寄语
2014/04/04 职场文书
小学班级口号
2014/06/09 职场文书
应届毕业生自荐书
2014/06/18 职场文书
初中班主任心得体会
2016/01/07 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers
JAVA springCloud项目搭建流程
2022/05/11 Java/Android
教你nginx跳转配置的四种方式
2022/07/07 Servers