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 相关文章推荐
COM中获取JavaScript数组大小的代码
Nov 22 Javascript
Javascript 刷新全集常用代码
Nov 22 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
Mar 01 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
Apr 01 Javascript
JavaScript在XHTML中的用法详解
Apr 11 Javascript
jQuery中:image选择器用法实例
Jan 03 Javascript
JS动态创建DOM元素的方法
Jun 09 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
May 09 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
Sep 05 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
Jan 30 Javascript
tracking.js页面人脸识别插件使用方法
Apr 16 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
Jan 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
用php过滤危险html代码的函数
2008/07/22 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
jQuery中:visible选择器用法实例
2014/12/30 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
python笔记(1) 关于我们应不应该继续学习python
2012/10/24 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
python爬虫实现获取下一页代码
2020/03/13 Python
解决Opencv+Python cv2.imshow闪退问题
2020/04/24 Python
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
一个SQL面试题
2014/08/21 面试题
厂长助理岗位职责
2013/12/27 职场文书
解除劳动合同协议书
2014/09/17 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
高中军训感想
2015/08/07 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python
Golang jwt身份认证
2022/04/20 Golang