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 相关文章推荐
基于jQuery的message插件实现右下角弹出消息框
Jan 11 Javascript
图片在浏览器中底部对齐 解决方法之一
Nov 30 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 Javascript
关于textarea提交的内容无法换行的解决办法
Apr 09 Javascript
jQuery写的日历(包括日历的样式及功能)
Apr 23 Javascript
解析JavaScript中的不可见数据类型
Dec 02 Javascript
node.js中的fs.fsyncSync方法使用说明
Dec 15 Javascript
jQuery中prop()方法用法实例
Jan 05 Javascript
jquery代码实现简单的随机图片瀑布流效果
Apr 20 Javascript
AngularJS $http模块POST请求实现
Apr 08 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
Feb 16 Javascript
微信小程序使用npm支持踩坑
Nov 07 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
留言板翻页的实现详解
2006/10/09 PHP
微盾PHP脚本加密专家php解密算法
2020/09/13 PHP
PHP操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
拖拉表格的JS函数
2008/11/20 Javascript
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
js 上传文件预览的简单实例
2016/08/16 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
基于python的字节编译详解
2017/09/20 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
python并发和异步编程实例
2018/11/15 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
python命令行工具Click快速掌握
2019/07/04 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
如何利用python进行时间序列分析
2020/08/04 Python
学前班教师的自我鉴定
2013/12/05 职场文书
任命书模板
2014/06/04 职场文书
佛光寺导游词
2015/02/10 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
Golang的继承模拟实例
2021/06/30 Golang
Python基本的内置数据类型及使用方法
2022/04/13 Python