javascript基于原型链的继承及call和apply函数用法分析


Posted in Javascript onDecember 15, 2016

本文实例讲述了javascript基于原型链的继承及call和apply函数用法。分享给大家供大家参考,具体如下:

1. 继承是面向对象编程语言的一个重要特性,比如Java中,通过extend可以实现多继承,但是JavaScript中的继承方式跟JAVA中有很大的区别,JS中通过原型链的方式实现继承。

(1)对象的原型:因为JS中,函数也是对象,因此我们先从对象出发。什么是对象的原型,原型的定义为:

所有通过对象直接量创建的对象都具有同一个函数原型,并且可以通过Object.prototype获得对原型对象的引用,通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。

注:没有原型的对象不多,Object.prototype对象是没有原型的。

(2)创建对象的原型

比如这里有一个Student对象和一个Person对象,其中,Student.prototype指向Person.prototype

对于创建对象完全不同的两种方法:

i)Student.prototype=Person.prototype

这种方法,创建Student的prototype对象,如果改变Student.prototype的值的时候,Person.prototype也会同时改变,为了避免这种情况,我们应采用其他方式;

ii)Student.prototype=Object.create(Person.prototype)

这种方法,创建的Student的Prototype对象,在改变Student.prototype的属性或者方法时,不会同时去改变Person.prototype的属性。

(3)基于继承的赋值操作

例1:

var o={
  x:1
}
o.x=2;
alert(o.x);//输出o.x=2

例2:

var o={
  x:1
}
var osp=Object.create(o);
alert(osp.x);//输出1
osp.x=2;
alert(osp.x);//输出2

i)从上面的两个例子中,我们大概可以看出来,如果对象osp上有x属性,那么无论是取值,还是赋值,都是基于osp对象上的直接属性x,如果osp对象上没有x属性,那么会沿着prototype原型链查找,直到找到一个包含x属性的prototype属性链上的对象,如果osp对象所有prototype原型链上都没有包含x属性,那么返回underfined。

ii)o对象属性的赋值,被视为在osp对象上直接进行,不会影响原型链上的属性。比如上例中的osp.x=2的赋值是在osp对象上,不会影响osp的原型对象o。

2. 举一些对象中继承的例子

(1)我们学过可以用instanceof来进行类型判断,instanceof方法本来就是基于原型链的。

比如例3:

[1,2] instanceof Array    //返回true
[1,2] instanceof Object   //返回true

这个例子说明Array.prototype也是继承于对象而来。

(2)函数中的组合继承问题

function student(name,age){
  this.name=name;
  this.age=age;
}
student.prototype.age=function(){
  return this.age;
}
function beststudent(name,age){
  student.call(this,age);
  return this.name;
}
beststudent.prototype=new student();
  alert(beststudent("yu",2))//输出2
}

3. call函数和apply函数

call函数和apply函数用于改变函数中this的指向,用于对象A调用对象B的方法,call函数和apply函数的区别在于传参的类型不同,apply(x,y),x表示的是执行函数的对象,而y则表示执行函数所需要调用的参数,是一个数组,并且可以传参为argument数组,而call(x,y)中的y之后的变量则是实实在在的变量;

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

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

Javascript 相关文章推荐
小议javascript 设计模式 推荐
Oct 28 Javascript
jQuery插件jquery-barcode实现条码打印的方法
Nov 25 Javascript
JS通过Cookie判断页面是否为首次打开
Feb 05 Javascript
基于JavaScript实现拖动滑块效果
Feb 16 Javascript
javascript数据结构之串的概念与用法分析
Apr 12 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
Jun 13 Javascript
JavaScript基本语法_动力节点Java学院整理
Jun 26 Javascript
js实现移动端轮播图效果
Dec 09 Javascript
微信小程序实现蓝牙打印
Sep 23 Javascript
微信小程序实现滑动翻页效果(完整代码)
Dec 06 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
Oct 18 Javascript
深入理解javascript中的this
Feb 08 Javascript
移动端脚本框架Hammer.js
Dec 15 #Javascript
WEB开发之注册页面验证码倒计时代码的实现
Dec 15 #Javascript
浅谈javascript alert和confirm的美化
Dec 15 #Javascript
JavaScript模板引擎Template.js使用详解
Dec 15 #Javascript
原生JS实现图片轮播切换效果
Dec 15 #Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Dec 15 #Javascript
利用vue写todolist单页应用
Dec 15 #Javascript
You might like
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
csdn 博客的css样式 v3
2009/02/24 Javascript
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
jQuery实现导航回弹效果
2017/02/27 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
剖析Python的Twisted框架的核心特性
2016/05/25 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
kafka-python批量发送数据的实例
2018/12/27 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
Python中使用双下划线防止类属性被覆盖问题
2019/06/27 Python
Python super()函数使用及多重继承
2020/05/06 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
Melijoe时尚童装德国官网:Melijoe德国
2016/09/03 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
.net工程师笔试题
2012/06/09 面试题
运动会领导邀请函
2014/01/10 职场文书
司机岗位职责
2015/02/04 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
mysql自增长id用完了该怎么办
2022/02/12 MySQL