手机版

js类继承的具体实现方法

时间:2021-11-11 来源:互联网 编辑:宝哥软件园 浏览:

在开始摆弄代码之前,您应该知道使用继承的目的和好处。一般来说,在设计类时,我们希望减少重复代码,尽量减少类之间的耦合。两者都很难做到。我们需要根据具体的条件和情况来决定应该采取什么方法。根据我们对面向对象语言中继承的理解,继承会直接带来类的强耦合,但js由于其独特的灵活性,可以设计强耦合弱耦合、高效率低效率的代码。用什么要看情况。提供了以下三种js继承方法:类继承、原型继承和混合元类。下面是类继承的简要描述,后两者将在后面的章节中简要描述。请多加关注和指导。谢谢你。类继承。js类继承的实现依赖于原型链。什么是原型链?js中的对象有一个属性prototy,它返回对象类型的引用,并提供对象类的一组基本函数。好像对原型有印象,对了,我们经常用这样的代码。复制的代码如下:VAR Person=function () {this。名称=' liyatang};Person.prototype={//您可以在这里提供Person的基本函数getname : function(){ returnthis . name;}}我们把类的基本函数放在prototype属性中,这意味着对象Person的引用有XXX函数。了解原型之后,我们需要了解什么是原型链。当访问一个对象的成员(属性或方法)时,如果在当前对象中没有找到这个成员,js将在原型属性所指向的对象中寻找它。如果没有找到,JS会继续在下一级原型指向的对象中寻找,直到找到为止。如果没有找到,未定义的将被返回。那么原型链给了我们什么呢?很容易认为原型链意味着一个类继承另一个类,只需将子类的原型设置为指向父类的实例。这将父类的成员绑定到子类,因为当在子类中找不到成员时,它将在父类中找到。(以上两段没有严格的措辞,只是用通俗易懂的语言描述。)接下来,我们需要一个中文类,它需要继承Person类的name和getName成员。复制的代码继承如下:VAR Chinese=function (name,nation) {//。需要调用父类的构造函数,可以通过调用来调用。这指向中国人。//只有人员在此范围内,成员人员才可以。呼唤被呼唤的人。this.nation=国家;};中文.原型=人.原型;//不能和以前一样,因为原型属性//中文。prototype={//getnation : function(){//returnthis . nation;//}//};//以下方法需要添加中文。prototype . get nation=function(){ return this . nation;};继承关系建立,所以我们称之为复制代码如下:VAR C=新汉语(' liyatang ',' China ');alert(c . getname());//liyatang所以类继承完成。真的完了吗?如果你用firebug在alert处设置一个断点,你会发现原来的Person.prototype被修改了,getNation方法被添加了。

这是因为上面的代码是中文。原型=人。原型;这是一个引用类型。修饰中文也修饰Person。这本身是不能容忍的,让类形成强耦合,这不是我们想要的效果。我们可以创建另一个对象或实例化一个实例来削弱耦合。复制代码如下://第一个//中文. prototype=new Person();//第二个//var F=function(){ };//f . prototype=person . prototype;//Chinese . prototype=f . prototype;这两种方法有什么区别?第二种类型增加了一个空函数f,可以避免创建父类的实例,因为有可能父类会比较大,父类的构造函数会有一些副作用,或者会执行很多计算任务。所以我推荐第二种方法。到这里,一切都结束了,还没有!在对象的属性原型下,有一个属性构造函数,它保存对构造特定对象实例的函数的引用。根据这种说法,Chiese.prototype.constructor应该等于中文,但它不是。回想一下,我们在设置Chiese的原型链的时候,覆盖了Person.prototype而不是Chiese.prototype,所以这个时候,Chiese.prototype.constructor就是Person。我们还需要添加以下代码复制代码如下://这里不需要研究if条件,只需要知道Chinese . prototype . constructor=Chinese if(Chinese . prototype . constructor==object . prototype . constructor){ Chinese . prototype . constructor=Chinese;}将所有代码整理如下,复制代码如下: var person=function(name){ this。name=name};person . prototype={ getName : function(){ return this . name;}};var Chinese=function(name,nation){ Person.call(this,name);this.nation=国家;};var F=function(){ };原型=人原型;中文.原型=F .原型;if(Chinese . prototype . constructor==object . prototype . constructor){ Chinese . prototype . constructor=Chinese;} Chinese . prototype . getnation=function(){ return this . nation;};var c=新汉语(' liyatang ',' China ');alert(c . getname());如果可以将继承的代码放在函数中,那么重用代码就很方便了。最后整理代码如下: Function Extend(子类,超类){ var f=Function(){ };f . prototype=SupClass . prototype;subclass . prototype=new F();子类. prototype.constructor=子类;subclass . super class=super class . prototype;//如果(super class . prototype . constructor==object . prototype . constructor){ super class . prototype . constructor=super class,则添加更多指向父类本身的属性以调用父类函数;} } var Person=function(name){ this . name=name;};person . prototype={ getName : function(){ return this . name;}};var Chinese=function(name,nation){ Person.call(this,name);this.nation=国家;};扩展(中文,人称);Chinese . prototype . getnation=function(){ return this . nation;};var c=新汉语(' liyatang ',' China ');alert(c . getname());后期修改:在一楼的评论下,我对扩展功能有了新的看法。在讨论如何设置原型链时,提出了两种复制代码的方法://第一种//Chinese . prototype=new Person();//第二个//var F=function(){ };//f . prototype=person . prototype;//Chinese . prototype=f . prototype;虽然第二种方法减少了调用父类构造函数的方式,但它在设计中文类时使用了Person.call(this,name)。这相当于调用父类的构造函数。然而,使用第一种方法可以减少中文中Person.call(this,name)的书写;这部分代码在子类中经常被遗忘。让我们把这个函数代码放在extend中。只写中文. prototype=new Person();它也达到了同样的目的:耦合性不强。但被遗忘的一点是,Chinese . prototype=new Person();没错。答案是错的!显然,新的Person()需要传递一个名称参数。我们不能在extend函数中做这部分工作,所以我们必须调用中文类中父类的构造函数。这也符合面向对象的思想。因此,我推荐第二种方法。

这是第一次写一篇关于技术的文章,基本上是按照我自己的思路展开的。难免会有一些地方没有考虑到,解释不清。请留言反馈。谢谢你。

版权声明:js类继承的具体实现方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。