本文实例讲述了JavaScript原型链与继承操作。分享给大家供大家参考,具体如下:
1. JavaScript继承
JavaScript继承可以说是发生在对象与对象之间,而原型链则是实现继承的主要方法;
1.1 原型链
利用原型让一引用类型继承另一个引用类型的属性和方法。
构造函数中有个prototype(每个函数中都有),指向他的原型对象,每个原型对象中也有一个constructor属性,指向原构造函数。通过构造函数创建的新对象中都有一个无法直接访问的[[proto]]属性,使得对象也指向构造函数的原型。这使得对象也获得了原型中的方法和属性。
当访问对象中的属性或方法时,如果对象中没有该属性或方法,则会向上一级原型对象中寻找该属性或方法,如果找了,就返回该属性,若没有则继续向上面的原型中去查找该属性。
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(); //李四吃饭了
运行结果:
注意:
①:当 Son.prototype
指向Father的时候,他就已经是父类型的Son了。
②:s1.eat();
s1中没有此方法,该方法在父类型原型中,当s1访问时,现在s1中查找,若没有则向他指向的原型中去查找该方法,若还是没有,则继续往上面的原型中查找。这样就形成了一条原型链。
③:通过原型链实现了继承。
简写:
var f1=new Father; var Son.prototype=f1 //可以直接简写成: var Son.prototypr=new Father(); //这个时候可以传值进去 ,其余地方无法传值
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
运行结果:
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);
注意:借调缺点: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面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]