手机版

JS继承——原型链继承和类继承

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

什么是继承?答:别人无偿给你的过程叫继承。为什么要用继承?回答:拿现成的。嗯,既然大家都想捡现成的,那就一定要学会如何继承!在你知道它之前,你需要知道构造函数、对象、原型链等概念.JS中常用的继承方式有两种:原型链继承(对象之间的继承)、类继承(构造函数之间的继承)、原型链继承:复制的代码如下://要继承的对象varparent={ name : ' Baba ' say 3360 function()。} }//新对象var child=proInherit(父对象);//测试警报(child . name);//' Baba ' child . say();//“我是巴巴”可以通过传入proInherit(obj)方法来继承对象的属性和方法。这个方法不是内置方法,需要自己定义,很简单:复制代码如下: function proinherit(obj){ function f()} { f . prototype=obj;返回新的F();}其中f()是一个临时的空构造函数,然后f()的原型被设置为父对象,但同时它通过受益于_proto_ link拥有其父对象的所有功能。链图:

类继承:复制的代码如下://父类构造函数functionparent () {this。名字=‘巴巴’;}//父类原型方法parent . prototype . getname=function(){ returnthis . name;}//子类构造函数Child(){ this . name=' cc ';}//类继承类继承(父,子);//实例var Child=new Child();警惕(孩子。getname())//“Baba”我们来看看这个继承的关键方法:classInherit(Parent,Child)复制代码如下: var Class Inherit=(function(){ var F=function(){ } return function(p,c){ F . prototype=p . c . prototype=new F();C . prototype . construter=C;}}());分析这个方法:首先,创建一个空的构造函数f(),并使用其实例的_proto_ attribute构造父类和子类的原型链。充当代理的目的是防止C.prototype=P.prototype,在子类被实例化后,当属性或方法被修改时,它将与父类一起被修改。采用全立即函数,在闭包中存储f(),避免了多次继承时创建大量的空构造函数,减少了内存消耗。最后一行表示由于原型链,C的实例对象的构造函数将指向P,因此被重置。链图:

尽管此方法在实例化时继承了原型方法,但父类的属性不能被继承。这里是复制继承,可以看作是类继承的补充。复制继承:复制代码如下://复制继承函数copyinherit (p,c) {var i,tostr=object . prototype . tostring,astr='[object array]';c=c | | { };for(I in p){ if(p . HasownProperty(I)){ if(type of p[I]===' object '){ c[I]=ToStr . call(p[I])==astr?[] : {};c[i]=copy(p[i],c[I]);} else { c[I]=p[I];} } }返回c;}//重写父函数parent () {this。名称=' PPthis.obj={a:1,b :2 };This.arr=[1,2]}//示例var Child=new Child();var Parent=new Parent();copyInherit(父级、子级);警惕(孩子。名字)//‘巴巴’警戒(孩子。arr)//1,2警报(儿童。物体。a)//1 copyInherit(p,c)在给变量赋值时分为两种方式,即传递值和传递引用。当父对象中的属性包含数组类型或对象类型时,c .[]: { };这句话将避免因修改子对象属性而导致对父对象属性的篡改。总结一下,类继承比较常见,因为这个构造函数大家都很熟悉,但是占用内存比较大。原型继承占用的内存较少,但是包含数组或克隆对象类型很麻烦。复制和继承简单,应用广泛。

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