手机版

js的2种继承方式详解

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

射流研究…中继承可以分为两种:对象冒充和原型链方式一、对象冒充包括三种:临时属性方式、呼叫()及应用()方式1.临时属性方式复制代码代码如下:函数人(名){这个。name=namethis.say=function(){ alert('我叫这个。名称');} }函数F2E(名称,id){这个。临时=人员;this.temp(名称);删除this . temp this . id=idthis . show id=function(){ alert('早上好,先生,我的工作号是这个。id ');}}var simon=new F2E('Simon ',9527);西蒙。say();西蒙。show id();2.call()/apply()方式实质上是改变了这指针的指向复制代码代码如下:函数人(名){这个。name=namethis.say=function(){ alert('我叫这个。名称');} }函数F2E(名称,id){ Person.call(this,name);//应用()方式改成Person.apply(此,新数组(名称));this . id=idthis . show id=function(){ alert('早上好,先生,我的工作号是这个。id ');}}var simon=new F2E('Simon ',9527);西蒙。say();西蒙。show id();缺点:先来看这么一张内存分配图

在面向对象的(=面向对象)概念中,新实例化后,对象就在堆内存中形成了自己的空间,值得注意的是,这个代码段。而成员方法就是存在这个代码段的,并且方法是共用的。问题就在这里,通过对象冒充方式继承时,所有的成员方法都是指向这的,也就是说新的之后,每个实例将都会拥有这个成员方法,并不是共用的,这就造成了大量的内存浪费。并且通过对象冒充的方式,无法继承通过原型方式定义的变量和方法,如以下代码将会出错:复制代码代码如下:函数人(名){这个。name=namethis.say=function(){ alert('我叫这个。名称');} }个人。原型。年龄=20岁;人。原型。sayage=function(){ alert('我的年龄是这个。年龄)};函数F2E(名字,id){ Person.apply(这个,新数组(名字));this . id=idthis . show id=function(){ alert('早上好,先生,我的工作号是这个。id ');}}var simon=new F2E('Simon ',9527);西蒙。SayAge();//提示类型错误: simon.sayAge不是函数二、原型链方式复制代码代码如下:函数Person(){ this。名字='西蒙';}人。原型。say=function(){ alert('我叫这个。名称');}函数F2E(id){这个。id=idthis.showId=function(){ alert('早上好,先生,我的工作号是这个。id ');} } f2e。prototype=new Person();var Simon=new F2E(9527);西蒙。say();西蒙。show id();警惕(西蒙。hasown属性(' id ');//检查是否为自身属性接下来按照上面的例子来理解以下射流研究…原型链概念

Prototype chain可以理解为:js中的每个对象都有一个隐藏的__proto__属性,一个实例化对象的__proto__属性指向其类的Prototype方法,这个prototype方法可以赋给另一个实例化对象,这个对象的__proto__需要指向其类,这样就形成了一个链,也就是前面代码中复制的代码如下。当js读取一个属性时,它将首先寻找自己的属性,然后依次寻找原型链中对象的属性。也就是说原型链的方法可以共享,从而解决了对象假装浪费内存的缺点。先说缺点:缺点很明显。原型链的继承意味着在实例化子类时参数不能传递给父类,这就是为什么这个例子中的函数Person()没有参数,而是直接写成这样。name="Simon "。以下代码不会达到预期效果:复制代码如下:功能人(姓名){this。name=name} person . prototype . say=function(){ alert('我叫' this . name ');}函数F2E(名称,id){ this . id=id;this.showId=function(){ alert('早上好,先生,我的工作号是' this . id ');} } f2e . prototype=new Person();var simon=new F2E('Simon ',9527);Simon . say();Simon . show id();函数Person(name){ this . name=name;} person . prototype . say=function(){ alert('我叫' this . name ');}函数F2E(名称,id){ this . id=id;this.showId=function(){ alert('早上好,先生,我的工作号是' this . id ');} } f2e . prototype=new Person();//这里不能传值,this.name和name都不行,但是直接写F2E.prototype=new Person('wood ')就可以了,但是这时simon.say()就变成了我的名字是wood var Simon=newf2e ('Simon ',9527);Simon . say();//弹出我的名字是undefinedsimon . showid();最后总结出较好的继承实现,其中成员变量采用对象模拟模式,成员方法采用原型链模式,代码如下:复制代码的代码如下:函数person (name) {this。name=name} person . prototype . say=function(){ alert('我叫' this . name ');}函数F2E(名称,id){ Person.call(this,name);this.id=id} f2e . prototype=new Person();//这里注意一个细节,showId不能写成f2e . prototype=new Person();原f2e . prototype . showid=function(){ alert('早上好,先生,我的工作号是' this . id ');}var simon=new F2E('Simon ',9527);Simon . say();Simon . show id();

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