在传统的基于类的语言中,如Java和C,继承的本质是扩展一个现有的类并生成一个新的子类。因为这种语言是严格分类举例的,继承实际上是类型的延伸。但是JavaScript采用原型继承,所以我们不能直接扩展一个Class,因为根本没有Class。
但是有办法。让我们首先回顾一下学生构造函数:
函数Student(props){ this . name=props . name | | ' unname ';} student . prototype . Hello=function(){ alert(' Hello,' this.name '!');}和学生的原型链:
现在,我们希望基于学生扩展小学生,我们可以首先定义小学生:
函数primary Student(props){//调用Student构造函数并绑定这个变量: Student.call(this,props);this . grade=props . grade | | 1;}但是,调用Student构造函数并不意味着继承Student。PrimaryStudent创建的对象的原型是:
新PrimaryStudent()-PrimaryStudent . prototype-object . prototype-null
我们必须找到修改原型链的方法:
新的PrimaryStudent()-PrimaryStudent . prototype-student . prototype-object . prototype-null
这样原型链是对的,继承关系也是对的。基于PrimaryStudent创建的新对象不仅可以调用PrimaryStudent.prototype定义的方法,还可以调用Student.prototype定义的方法,如果你想用最简单粗暴的方式做到这一点:小学生。原型=学生。原型;
是不行的!如果是这样,PrimaryStudent和Student共享一个原型对象,那么为什么要定义PrimaryStudent呢?
我们必须用一个中间对象来实现正确的原型链,这个中间对象的原型应该指向Student.prototype,要实现这一点,可以参考道野(发明JSON的道格拉斯)的代码,中间对象可以用一个空函数f来实现:
//PrimaryStudent构造函数:函数小学生(道具){student。召唤(这个,道具);this . grade=props . grade | | 1;}//空函数F:function F() {}//将F的原型指向student . prototype 3360 F . prototype=student . prototype;//将PrimaryStudent的原型指向一个新的F对象,该对象只指向Student。Prototype: PrimaryStudent。原型=新f();//修复PrimaryStudent原型的构造函数为小学生:小学生. prototype.constructor=小学生;//继续在PrimaryStudent原型(即新的F()对象)上定义方法:PrimaryStudent . prototype . getgrade=function(){ return this . grade;};//创建小明: var小明=新小学生({姓名: '小明',年级: 2 });小明.姓名;//“小明”小明. grade;//2//验证原型:小明。_ _ proto _ _==小学生。原型;//true晓明。__原型_ _。_ _ proto _ _===Student.prototype//true//验证继承关系:小明实例小学生;//学生真实小明实例;//true用一张图片来表示新的原型链:
注意,函数F只用于桥接,我们只创建了一个新F()的实例,并没有改变原Student定义的原型链。如果用inherits()函数封装继承操作,可以隐藏f的定义并简化代码:
函数继承(子,父){ var F=function(){ };原型=父原型;child . prototype=new F();Child . prototype . constructor=Child;} this inherits()函数可以重用:function student (props) {this。名称=道具。名称| |“未命名”;} student . prototype . Hello=function(){ alert(' Hello,' this.name '!');}函数PrimaryStudent(道具){ Student.call(这个,道具);this . grade=props . grade | | 1;}//实现原型继承链: inherits(小学生,学弟);//将其他方法绑定到PrimaryStudent prototype : PrimaryStudent . prototype . get grade=function(){ return this . grade;};总结
JavaScript的原型继承实现如下:
1.定义一个新的构造函数,用call()在内部调用想要“继承”的构造函数,并将其绑定;2.原型链继承是借助中间函数F实现的,最好是通过封装的继承函数;3.继续在新构造函数的原型上定义新方法。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。