本文实例总结了JavaScript类的继承操作。分享给大家供大家参考,具体如下:
<强>一、类式继承强>
首先要做的是创建构造函数。按惯例,其名称就是类名,首字母应该大写。在构造函数中,创建实例属性要用关键字<代码> 代码>。类的方法则被添加到<代码> 代码>原型对象中。要创建该类的实例,只需结合关键字<代码> 代码>新调用这构造函数即可。
/*类的人。*/函数的人(名字){ this.name=名称; } Person.prototype。getName=function () { 返回this.name; } 读者var=新人(“约翰·史密斯”); reader.getName (); >之前<强>二,原型链强>
JavaScript的每个对象都有一个名为<代码> 代码>原型的属性,这个属性要么指向另一个对象,要么是null。在访问对象的某个成员时,如果这个成员未见于当前对象,那么就会到原型所指的对象中去查找。如果还是没有找的到,那么就会沿着原型链逐一访问每个原型对象,直到找到这个成员。这意味着让一个类继承另一个类,只需将子类的原型<代码> 代码>设置为超类的一个实例即可。
为了让作者继承人,必须手工将作者的<代码> 代码>原型设置为个人的一个实例。最后一步是将原型<代码> 代码>的<代码> 代码>属构造性重设为作者(因为<代码> 代码>属原型性设置为个人的实例)时,其<代码> 代码>属构造性被抹除了。
函数的作者(姓名、书籍){ 的人。调用(这名字);//调用父类的构造函数的范围。 这一点。书=书;//添加一个属性。 } 作者。原型=新人();//设置原型链。 Author.prototype。构造函数=作者;//构造函数属性设置为作者。 Author.prototype。getBooks=function(){//添加一个方法,作者。 返回this.books; }; 作者var=[]; 作者[0]=new作者(达斯汀·迪亚兹,['设计模式JavaScript ']); 作者[1]=new作者(“罗斯伤害”,['设计模式JavaScript ']); console.log(作者[1]. getname ()); console.log(作者[1].getBooks ()); >之前<强>三,延长函数强>
为了简化类的声明,可以把派生子类的整个过程包装在一个名为扩展的函数中。它的作用与其他语言的<代码> 代码>扩展关键字类似,即基于一个给定的类的结构创建一个新的类:
功能扩展(父类,子类){ var F=function () {}; F。原型=superClass.prototype; 子类。原型=new F (); subClass.prototype。构造函数=子类; } >之前其实所做的事与之前的是一样的。它先设置了<代码> 代码>原型,然后再将其构造函数<代码> 代码>重设为恰当的值。并且中间利用了一个空函数,这样就可以避免创建超类的实例。使用<代码> 代码>扩展继承的写法:
函数的人(名字){ this.name=名称; } Person.prototype。getName=function () { 返回this.name; }/*类作者。*/函数的作者(姓名、书籍){ 的人。调用(这名字); 这一点。书=书; } 扩展(作者、人); Author.prototype。getBooks=function () { 返回this.books; }; >之前但上面的存在一个问题就是超类人的名称被固化在作者类的声明当中。更普世性的做法应该像下面这样:
/*扩展功能,改善。*/功能扩展(父类,子类){ var F=function () {}; F。原型=superClass.prototype; 子类。原型=new F (); subClass.prototype。构造函数=子类; 子类。超类=superClass.prototype; 如果(superClass.prototype。构造函数==Object.prototype.constructor) { superClass.prototype。构造函数=超类; } }/*类作者。*/函数的作者(姓名、书籍){ Author.superclass.constructor。调用(这名字); 这一点。书=书; } 扩展(作者、人); Author.prototype。getBooks=function () { 返回this.books; }; Author.prototype。getName=function () { var name=Author.superclass.getName.call(这个); 的作者返回名称+ ' ' + this.getBooks ()。加入(" "); }; >之前这个<代码>扩展> 代码改进之后,多了一个超类的属性,这个属性可以弱化作者和人之间的耦合。<代码> 代码>扩展后面三行用来确保超类的construtor已经被正确设置了。有了超类的属性,就可以直接调用超类中的方法。这在既要重新定义超类的某个方法而又想访问其在超类中的实现时可以派上用场。例如,为了用一个新的getName的方法重新定义人类中的同名方法,你可以先用
JavaScript类的继承操作实例总结