js继承的两种方式

js继承的两种方式

ID:47117281

大小:20.32 KB

页数:4页

时间:2019-08-07

js继承的两种方式_第1页
js继承的两种方式_第2页
js继承的两种方式_第3页
js继承的两种方式_第4页
资源描述:

《js继承的两种方式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Js的继承实现方法Js的继承在很多书里面细致的分了很多种类型和实现方式,大体上就是两种:对象冒充、原型方式。这两种方式各有优点和缺陷,这里我先列举出来,再从底层分析区别:1对象冒充functionA(name){this.name=name;this.sayHello=function(){alert(this.name+”sayHello!”);};}functionB(name,id){this.temp=A;this.temp(name);//相当于newA();deletethis.temp;//防止在以后通过temp引用覆盖超类A的属性和方法this.id=id;th

2、is.checkId=function(ID){alert(this.id==ID)};}当构造对象B的时候,调用temp相当于启动A的构造函数,注意这里的上下文环境中的this对象是B的实例,所以在执行A构造函数脚本时,所有A的变量和方法都会赋值给this所指的对象,即B的实例,这样子就达到B继承了A的属性方法的目的。之后删除临时引用temp,是防止维护B中对A的类对象(注意不是实例对象)的引用更改,因为更改temp会直接导致类A(注意不是类A的对象)结构的变化。我们看到了,在Js版本更新的过程中,为了更方便的执行这种上下文this的切换以达到继承或者更加广义的目的,增加了c

3、all和apply函数。它们的原理是一样的,只是参数不同的版本罢了(一个可变任意参数,一个必须传入数组作为参数集合)。这里就以call为例子,解释一下用call实现的对象冒充继承。functionRect(width,height){this.width=width;this.height=height;this.area=function(){returnthis.width*this.height;};}functionmyRect(width,height,name){Rect.call(this,width,height);this.name=name;this.sho

4、w=function(){alert(this.name+”witharea:”+this.area());}}关于Call方法,官方解释:调用一个对象的一个方法,以另一个对象替换当前对象。call(thisOb,arg1,arg2…)这也是一种对象冒充的继承,其实在call方法调用的时候发生的事情也是上下文环境变量this的替换,在myRect函数体中this肯定是指向类myRect对象的实例了,然而用这个this作为上下文环境变量调用名字叫Rect方法,即类Rect的构造函数。于是此时调用Rect时候对this的赋值属性和方法都实际上是对一个myRect的对象进行。所以说尽

5、管call和apply并不是仅仅为了继承而新增的方法,但用它们可以模拟继承。对象冒充继承就是这么一回事,它可以实现多重继承,只要重复做这一套赋值的流程就可以了。不过目前真正大规模使用得并不多,为什么呢?因为它有一个明显的性能缺陷,这就要说道OO的概念了,我们说对象是成员+成员方法的集合,构造对象实例的时候,这些实例只需要拥有各自的成员变量就可以了,成员方法只是一段对变量操作的可执行文本区域而已,这段区域不用为每个实例而复制一份,所有的实例都可以共享。现在回到Js利用对象冒充模拟的继承里,所有的成员方法都是针对this而创建的,也就是所所有的实例都会拥有一份成员方法的副本,这是对

6、内存资源的一种极度浪费。其它的缺陷比如说对象冒充无法继承prototype域的变量和方法就不用提了,笔者认为前一个致命缺陷就已经足够。不过,我们还是需要理解它,特别是父类的属性和方法是如何继承下来的原理,对于理解Js继承很重要。1.1优点1.可以实现多重继承2.可以初始化继承自父类的参数1.2缺点1.浪费内存资源,所有的实例都会拥有一份成员方法的副本。2原型方式第二种继承方式是原型方式,所谓原型方式的继承,是指利用了prototype或者说以某种方式覆盖了prototype,从而达到属性方法复制的目的。其实现方式有很多中,可能不同框架多少会有一点区别,但是我们把握住原理,就不会

7、有任何不理解的地方了。看一个例子(某一种实现):functionPerson(){this.name=“Mike”;this.sayGoodbye=function(){alert(“GoodBye!”);};}Person.prototype.sayHello=function(){alert(”Hello!”);};functionStudent(){}Student.prototype=newPerson();关键是对最后一句Student原型属性赋值为Person类构造的对象,这里笔

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。