基于JavaScript实现继承机制之调用call()与apply()的方法详解


Posted in Javascript onMay 07, 2013

call() 方法

call() 方法是与经典的对象冒充方法最相似的方法。它的第一个参数用作 this 的对象。其他参数都直接传递给函数自身。例如:

function sayHello(sPrefix,sSuffix) {
    alert(this.name + ”says“ + sPrefix + sSuffix);
};
var obj = new Object();
obj.name = "Tom";
sayHello.call(obj, "Hello ", "World.");

在这个例子中,函数 sayHello() 在对象外定义,即使它不属于任何对象,也可以引用关键字 this。对象 obj 的 name属性等于 blue。调用 call() 方法时,第一个参数是 obj,说明应该赋予 sayHello() 函数中的 this 关键字值是 obj。第二个和第三个参数是字符串。它们与 sayHello() 函数中的参数 sPrefix 和 sSuffix 匹配,最后生成的消息 "Tom says Hello World." 将被显示出来。

要与继承机制的对象冒充方法一起使用该方法,只需将前三行的赋值、调用和删除代码替换即可:

function ClassA(sColor) {
    this.color = sColor;
    this.sayColor = function () {
        alert(this.color);
    };
}

function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.call(this, sColor);
    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

这里,我们需要让 ClassA 中的关键字 this 等于新创建的 ClassB 对象,因此 this 是第一个参数。第二个参数 sColor 对两个类来说都是唯一的参数。

apply() 方法

apply() 方法有两个参数,用作 this 的对象和要传递给函数的参数的数组。例如:

function sayColor(sPrefix,sSuffix) {
    alert(sPrefix + this.color + sSuffix);
};
var obj = new Object();
obj.color = "blue";
sayColor.apply(obj, new Array("The color is ", "a very nice color indeed."));

这个例子与前面的例子相同,只是现在调用的是 apply() 方法。调用 apply() 方法时,第一个参数仍是 obj,说明应该赋予 sayColor() 函数中的 this 关键字值是 obj。第二个参数是由两个字符串构成的数组,与 sayColor() 函数中的参数 sPrefix 和 sSuffix 匹配,最后生成的消息仍是 "The color is blue, a very nice color indeed.",将被显示出来。

该方法也用于替换前三行的赋值、调用和删除新方法的代码:

function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.apply(this, new Array(sColor));
    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

同样的,第一个参数仍是 this,第二个参数是只有一个值 color 的数组。可以把 ClassB 的整个 arguments 对象作为第二个参数传递给 apply() 方法:
function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.apply(this, arguments);
    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

当然,只有超类中的参数顺序与子类中的参数顺序完全一致时才可以传递参数对象。如果不是,就必须创建一个单独的数组,按照正确的顺序放置参数。此外,还可使用 call() 方法。

我们可以看到这两个方法能够很好的代替原始的对象冒充,使写法上变得稍微简单。但是这些方法的弊端是子类不能继承父类在原型链上声明的方法或属性,针对这个问题下一篇文章将会介绍JavaScript中另一种实现继承的方式—原型链继承。

Javascript 相关文章推荐
jquery select操作的日期联动实现代码
Dec 06 Javascript
js仿百度贴吧验证码特效实例代码
Jan 16 Javascript
JavaScript中的分号插入机制详细介绍
Feb 11 Javascript
使用jquery获取url及url参数的简单实例
Jun 14 Javascript
Bootstrap Modal遮罩弹出层代码分享
Nov 21 Javascript
jQuery网页定位导航特效实现方法
Dec 19 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
Mar 14 Javascript
AngularJS中的拦截器实例详解
Apr 07 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
May 19 Javascript
在vue中使用jointjs的方法
Mar 24 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
Jul 22 Javascript
vue3不同环境下实现配置代理
May 25 Vue.js
JS中的substring和substr函数的区别说明
May 07 #Javascript
js图片自动切换效果处理代码
May 07 #Javascript
JavaScript通过RegExp实现客户端验证处理程序
May 07 #Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
May 07 #Javascript
使用Math.floor与Math.random取随机整数的方法详解
May 07 #Javascript
基于JavaScript 类的使用详解
May 07 #Javascript
解读JavaScript中 For, While与递归的用法
May 07 #Javascript
You might like
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
ES6学习教程之模板字符串详解
2017/10/09 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
如何获取vue单文件自身源码路径
2019/05/06 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
图文详解WinPE下安装Python
2016/05/17 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
使用python编写监听端
2018/04/12 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
数据库笔试题
2013/05/09 面试题
销售自荐信
2013/10/22 职场文书
生产现场工艺工程师岗位职责
2013/11/28 职场文书
机械专业应届生求职信
2013/12/12 职场文书
甲方资料员岗位职责
2013/12/13 职场文书
花坛标语大全
2014/06/30 职场文书
法人委托书的范本格式
2014/09/11 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
严以用权学习心得体会
2016/01/12 职场文书