JavaScript原型链与继承操作实例总结


Posted in Javascript onAugust 24, 2018

本文实例讲述了JavaScript原型链与继承操作。分享给大家供大家参考,具体如下:

1. JavaScript继承

JavaScript继承可以说是发生在对象与对象之间,而原型链则是实现继承的主要方法;

1.1 原型链

利用原型让一引用类型继承另一个引用类型的属性和方法。

构造函数中有个prototype(每个函数中都有),指向他的原型对象,每个原型对象中也有一个constructor属性,指向原构造函数。通过构造函数创建的新对象中都有一个无法直接访问的[[proto]]属性,使得对象也指向构造函数的原型。这使得对象也获得了原型中的方法和属性。

JavaScript原型链与继承操作实例总结

当访问对象中的属性或方法时,如果对象中没有该属性或方法,则会向上一级原型对象中寻找该属性或方法,如果找了,就返回该属性,若没有则继续向上面的原型中去查找该属性。

1.2 构造函数的原型链继承

function Father(name,age){
    this.name=name;
    this.age=age;
}
Father.prototype.eat=function(){ //给原型添加eat方法
    console.log(this.name+"吃饭了");
}
var f1=new Father("李四",20); //创建新对象f1, [[proto]]指向父原型
function Son(){
}
Son.prototype=f1; //将子构造函数的prototype指向了父类型的对象,这里实现了——继承
var s1=new Son(); // 创建子对象
s1.eat(); //李四吃饭了

运行结果:

JavaScript原型链与继承操作实例总结

注意:

①:当 Son.prototype指向Father的时候,他就已经是父类型的Son了。

②:s1.eat();s1中没有此方法,该方法在父类型原型中,当s1访问时,现在s1中查找,若没有则向他指向的原型中去查找该方法,若还是没有,则继续往上面的原型中查找。这样就形成了一条原型链。

③:通过原型链实现了继承。

简写:

var f1=new Father;
var Son.prototype=f1
//可以直接简写成:
var Son.prototypr=new Father(); //这个时候可以传值进去 ,其余地方无法传值

JavaScript原型链与继承操作实例总结

1.3 默认顶端原型

默认的顶端原型:

是当所有类型都没有指明继承某个类型时,则默认继承Object类型。

objec中也有prototype指向他的object原型,object中也有[[proto]],只不过他指向的是null;可忽略。

object的很多方法,都是存在object的原型中;

在原型链中查找,从当前位置一直往上访问,直到原型链顶端位置。

1.4 测试数据

typeof 测数据的类型,最好只来测试基本类型数据,应为除了基本类型外全是返回object。

console.log(typeof 123) //number
console.log(typeof "ccsa ") //string

instnaceof 测试一个对象属不属于其父类对象的类型

function Father(name){
}
var f1=new Father();
console.log(f1 instanceof Father); //true

运行结果:

JavaScript原型链与继承操作实例总结

isPrototypeOf(要测的对象) 专属于原型对象的方法,判断该对象在不在该原型链上,使用:父类构造函数.prototype.isPrototypeOf(对象)

function Father(){
}
function Son(){
}
Son.prototype=new Father;
var s1=new son();
console.log(Father.prototype.isPrototypeOf(s1));  //true
console.log(Object.prototype.isPrototypeOf(s1));  //true

1.5 借调

借调:借用构造函数调用冒充继承,借调实现的继承,不是真正的继承,只是借用构造函数中的属性或方法。

apply,call。

function Fn(name,age){
   this.name=name;
   this.age=20;
}
function Son(name,age,sex){
   Fn.call(this,name,age)        //借调继承Fn;
   this.sex=sex;
};
var s1=new Son("李四",20,"男");
console.log(s1);

JavaScript原型链与继承操作实例总结

注意:借调缺点:call是冒充继承,不是真正的继承,所以不能访问原构造函数的原型中的属性或方法。

1.6 组合继承

组合构造函数的借调继承和原型的继承优点:

function Fn(name,age){
   this.name=name; //构造函数的属性多样
   this.age=age;
   if((typeof Fn.prototype.eat)!="funciton"){ //判断语句中是否有该方法,没有则创建
    Fn.prototype.eat=function(){ //原型的方法共享
      console.log(this.name+"吃了饭");
    }
   }
}
function Son(name,age,sex){ //创建子类构造函数
   Fn.call(this,name,age) //借调Fn()的属性
   this.sex=sex;
};
Son.prototype=new Fn(); //Son.prototype指向父类对象,实现了继承,所以能够调用eat方法,
var s1=new Son("李四",20,"男"); //若没有继承,单单的使用call借调Fn继承,子类实例s1无法调用eat方法
callconsole.log(s1); //因为call不是真正的继承
s1.eat();

注意:Son.prototype=new Fn(); 这条语句 实现了Son继承父类型Fn;Son指向的是父类型创建的对象,而父类型的对象有自己的属性,并且又成为了子类型的原型,那么其中的属性不就成了共享的了吗。 但是前面还有用到Fn.call( ),这条语句已经借调了父类构造函数属性,相当于覆盖了子类型原型的属性。

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

Javascript 相关文章推荐
解决JS浮点数运算出现Bug的方法
Mar 12 Javascript
玩转方法:call和apply
May 08 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
Sep 11 Javascript
JS实现的在线调色板实例(附demo源码下载)
Mar 01 Javascript
基于vue-video-player自定义播放器的方法
Mar 21 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
Mar 22 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
May 08 Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 Javascript
Node.js+ELK日志规范的实现
May 23 Javascript
vue实现二级导航栏效果
Oct 19 Javascript
基于javascript实现碰撞检测
Mar 12 Javascript
angular4实现带搜索的下拉框
Mar 25 Javascript
element-ui循环显示radio控件信息的方法
Aug 24 #Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
Aug 24 #Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
Aug 24 #Javascript
AngularJS自定义表单验证功能实例详解
Aug 24 #Javascript
Vue源码解读之Component组件注册的实现
Aug 24 #Javascript
element-ui 关于获取select 的label值方法
Aug 24 #Javascript
微信小程序用户信息encryptedData详解
Aug 24 #Javascript
You might like
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
php给图片加文字水印
2015/07/31 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
jQuery Ajax文件上传(php)
2009/06/16 Javascript
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
查询绑定数据岛的表格中的文本并修改显示方式的js代码
2009/12/15 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
jQuery拖拽div实现思路
2014/02/19 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
在JavaScript中操作时间之setYear()方法的使用
2015/06/12 Javascript
浅谈javascript中的DOM方法
2015/07/16 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
python引用DLL文件的方法
2015/05/11 Python
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
python 字符串追加实例
2019/07/20 Python
Django RBAC权限管理设计过程详解
2019/08/06 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
快餐店的创业计划书范文
2014/01/29 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
论文答谢词
2015/01/20 职场文书
vue+echarts实现多条折线图
2022/03/21 Vue.js