位置: 编程技术 - 正文

详述JavaScript实现继承的几种方式(推荐)(javascript的描述)

编辑:rootadmin

推荐整理分享详述JavaScript实现继承的几种方式(推荐)(javascript的描述),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript简述,javascript简述,js的实现原理,js中的实例是什么,js中的实例是什么,js类的实现,js中的实例是什么,javascript简述,内容如对您有帮助,希望把文章链接给更多的朋友!

ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的。

原型链

原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的指针。如果:我们让原型对象A等于另一个类型B的实例,那么原型对象A就会有一个指针指向B的原型对象,相应的B的原型对象中保存着指向其构造函数的指针。假如B的原型对象又是另一个类型的实例,那么上述的关系依旧成立,如此层层递进,就构成了实例与原型的链条。

实例以及构造函数和原型之间的关系图如下所示:

person.constructor现在指向的是Parent,这是因为Child.prototype指向了Parent的原型,而Parent原型对象的constructor指向Parent。

当以读取模式访问一个实例属性时,首先会在实例中搜索该属性,如果没有找到该属性,则会继续搜索实例的原型。在通过原型链实现的集成中,搜索过程就会沿着原型链继续向上,直到搜索到原型链的末端。

例如,调用person.getParentValue()方法,1)搜索实例;2)搜索Child.prototype;3)搜索Parent.prototype;找到了getParentValue()方法停止。

1、默认的原型

前面的例子中展示的原型链少了一环,所有引用类型默认都继承了Object,而这个继承也是通过原型链实现的。因此默认的原型都包含一个内部指针,指向Object.prototype,这也正是所有自定义类型会继承toString()、ValueOf()等默认方法的根本原因。换句话说Object.prototype就是原型链的末端。

2、确定原型和实例的关系

通过两种方式可以确定原型和实例之间的关系,第一种是使用instanceOf操作符,第二种是使用isPrototypeOf()方法。 实例 instanceOf 原型链 中出现过的构造函数,都会返回true

3、谨慎地定义方法

子类型有时候需要覆盖超类型中的某个方法,或者需要添加超类型中不存在的莫个方法,注意:给原型添加方法的代码一定要放在替换原型的语句之后。

当通过Child的实例调用getParentValue()时,调用的是这个重新定义过的方法,但是通过Parent的实例调用getParentValue()时,调用的还是原来的方法。

格外需要注意的是:必须要在Parent的实例替换原型之后,再定义这两个方法。

还有一点需要特别注意的是:通过原型链实现继承时,不能使用对象字面量创建原型方法,因为这样做会重写原型链。

详述JavaScript实现继承的几种方式(推荐)(javascript的描述)

以上代码刚把Parent的实例赋值给Child的原型对象,紧接着又将原型替换成一个字面量,替换成字面量之后,Child原型实际上包含的是一个Object的实例,而不再是Parent的实例,因此我们设想中的原型链被切断.Parent和Child之间没有任何关联。

4、原型链的问题

原型链很强大,可以利用它来实现继承,但是也有一些问题,主要的问题还是包含引用类型值的原型属性会被所有实例共享。因此我们在构造函数中定义实例属性。但是在通过原型来实现继承时,原型对象其实变成了另一个类型的实例。于是原先定义在构造函数中的实例属性变成了原型属性了。

举例说明如下:

在Parent构造函数中定义了一个friends属性,该属性值是一个数组(引用类型值)。这样,Parent的每个实例都会各自包含自己的friends属性。当Child通过原型链继承了Parent之后,Child.prototype也用用了friends属性——这就好像friends属性是定义在Child.prototype一样。这样Child的所有实例都会共享这个friends属性,因此我们对kid1.friends做的修改,在kid2.friends中也会体现出来,显然,这不是我们想要的。

原型链的另一个问题是:在创建子类型的实例时,不能在不影响所有对象实例的情况下,给超类型的构造函数传递参数。因此,我们通常很少会单独使用原型链。

借用构造函数

为了解决原型中包含引用类型值带来的一些问题,引入了借用构造函数的技术。这种技术的基础思想是:在子类型构造函数的内部调用超类型构造函数。

Parent.call(this)在新创建的Child实例的环境下调用了Parent构造函数。在新创建的Child实例环境下调用Parent构造函数。这样,就在新的Child对象上,此处的kid1和kid2对象上执行Parent()函数中定义的对象初始化代码。这样,每个Child实例就都会具有自己的friends属性的副本了。

借用构造函数的方式可以在子类型的构造函数中向超类型构造函数传递参数。

为了确保子类型的熟悉不会被父类的构造函数重写,可以在调用父类构造函数之后,再添加子类型的属性。 构造函数的问题:

构造函数模式的问题,在于方法都在构造函数中定义,函数复用无从谈起,因此,借用构造函数的模式也很少单独使用。

组合继承

组合继承指的是将原型链和借用构造函数的技术组合在一块,从而发挥二者之长。即:使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。

Person构造函数定义了两个属性:name和friends。Person的原型定义了一个方法sayName()。Child构造函数在调用Parent构造函数时,传入了name参数,紧接着又定义了自己的属性age。然后将Person的实例赋值给Child的原型,然后又在该原型上定义了方法sayAge().这样,两个不同的Child实例既分别拥有自己的属性,包括引用类型的属性,又可以使用相同的方法了。 组合继承避免了原型链和构造函数的缺陷,融合了他们的有点,成为JavaScript中最常用的继承模式。而且,instanceOf和isPropertyOf()也能够识别基于组合继承创建的对象。

最后,关于JS对象和继承都还有几种模式没有写,或者说,我自己也还未去深刻研究,但是,我想,首先将组合模式应用的游刃有余。并且,对于为何选用组合模式,知其然,知其所以然。

关于JavaScript实现继承的几种方式(推荐),小编就给大家介绍到这里,希望对大家有所帮助!

基于javascript实现文字无缝滚动效果 本文实例为大家分享了javascript实现文字无缝滚动的全部代码,供大家参考,具体内容如下效果图:实现代码:!DOCTYPEhtmlhtmlheadmetacharset="gb"metahttp-equiv=

JS中多种方式创建对象详解 1.内置对象创建vargirl=newObject();girl.name='hxl';console.log(typeofgirl);2.工厂模式,寄生构造函数模式functionPerson(name){varp=newObject();//内部进行实例化p.name=name;p.say=fu

javascript仿京东导航左侧分类导航下拉菜单效果 本文实例为大家分享了类似于京东、淘宝商城左侧分类导航下拉菜单,供大家参考,具体内容如下效果图:实现代码:!DOCTYPEhtmlhtmlheadmetacharset="gb"meta

标签: javascript的描述

本文链接地址:https://www.jiuchutong.com/biancheng/377451.html 转载请保留说明!

上一篇:浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号(浅析学校德育的个体智能发展功能)

下一篇:基于javascript实现文字无缝滚动效果(基于javascript的毕业设计)

  • 个体工商户需要进项发票吗
  • 消费税计算时的进项税额
  • 转出未交增值税借方
  • 有金额的框架协议要交印花税吗
  • 一般纳税人简易计税可以抵扣进项税额吗
  • 计入投资收益的手续费
  • 咨询服务费开票税率
  • 小型微利企业年应纳税所得额不超过100万元的部分
  • 商业汇票和商业本票
  • 印花税交完有什么凭证
  • 财务合理化建议例子
  • 事业单位结余如何分配
  • 住宿费专票可以报销吗
  • 电商刷单的成本如何处理?
  • 专项资金怎么入账
  • 发票二维码压线可以用吗
  • 开发经济适用房是否需要缴纳土增税
  • 外籍劳务费个税扣除标准
  • 注册资本印花税按实缴还是认缴
  • 汇算清缴所得税账务处理
  • 税控盘逾期未抄报,交罚款需要带什么
  • 固定资产原值减预计净残值等于什么
  • 此次新政策对原来就是小型微利企业的纳税人有影响吗?
  • 腾讯电脑管家帮忙卸载
  • switcher.exe - switcher是什么进程
  • bios是什么请简要介绍一下
  • ajax请求php接口
  • 金银首饰在哪个软件买
  • 公司修好厂房老板怎么说
  • 商品流通企业商品销售成本计量方法有
  • wordpress用什么开发的
  • 印克斯湖国家公园中的德克萨斯矢车菊,德克萨斯州 (© Inge Johnsson/Alamy)
  • 日落后的托莱多全景,西班牙 (© Frank Fischbach/Alamy)
  • frameworkscheduled
  • 递延收益摊销金额
  • php判断字符串是否存在
  • php动态读取数据的代码
  • reactvate
  • gym版本和render函数
  • 2手房价格
  • php功能实现
  • 子公司吸收合并母公司 特殊性税务处理
  • 消耗性生物资产的账务处理
  • 支付广告费没有票怎么入账
  • mysql group by实现原理
  • 销售代销货物会计处理
  • 收到加工费怎么做账务处理分录
  • 应税消费品含税吗
  • 用货款抵扣供应商成本
  • 完工产品制造成本表
  • 支付给劳务人员劳务费需缴纳印花
  • 出口产品开票注意事项
  • 报销单会计分录怎么写
  • 应付账款会计分录例题
  • 给对方承兑对方不承认怎么办
  • 银行存款手工账
  • 收到保险公司赔款
  • 库存的周转天数
  • 没有期初数据会怎么样
  • macossierra安装发生错误
  • winxp搜索文件内容搜不出来
  • win8如何激活
  • centos7配置ssh免密码登录
  • service5.exe - service5是什么进程 有什么用
  • 彻底理解样本方差为何除以n-1
  • [置顶]bilinovel
  • bootstrap怎样为进度条添加动画
  • Javascript WebSocket使用实例介绍(简明入门教程)
  • 批处理基础知识
  • nodejs遍历json数据
  • javascriptz
  • scroll-view组件用于实现
  • Python的collections模块中namedtuple结构使用示例
  • 化妆品的消费税率为
  • 被标记为广告推销的电话能接吗
  • 内蒙古税务稽查局
  • 个人彩票收入属什么类别
  • 无锡第三税务分局
  • 郑州市国家税务局地址在哪里
  • 土地增值税分期清算条件?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设