位置: 编程技术 - 正文

JS面向对象编程详解(js面向对象编程思想)

编辑:rootadmin

推荐整理分享JS面向对象编程详解(js面向对象编程思想),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js面向对象编程实例,js中面向对象编程,js面向对象写法,js中面向对象编程,js面向对象编程思想,js面向对象编程思想,js面向对象编程实例,js面向对象编程实例,内容如对您有帮助,希望把文章链接给更多的朋友!

序言  在JavaScript的大世界里讨论面向对象,都要提到两点:1.JavaScript是一门基于原型的面向对象语言 2.模拟类语言的面向对象方式。对于为什么要模拟类语言的面向对象,我个人认为:某些情况下,原型模式能够提供一定的便利,但在复杂的应用中,基于原型的面向对象系统在抽象性与继承性方面差强人意。由于JavaScript是唯一一个被各大浏览器支持的脚本语言,所以各路高手不得不使用各种方法来提高语言的便利性,优化的结果就是其编写的代码越来越像类语言中的面向对象方式,从而也掩盖了JavaScript原型系统的本质。  

基于原型的面向对象语言  原型模式如类模式一样,都是是一种编程泛型,即编程的方法论。另外最近大红大紫的函数编程也是一种编程泛型。JavaScript之父Brendan Eich在设计JavaScript时,从一开始就没打算为其加入类的概念,而是借鉴了另外两门基于原型的的语言:Self和Smalltalk。

  既然同为面向对象语言,那就得有创建对象的方法。在类语言中,对象基于模板来创建,首先定义一个类作为对现实世界的抽象,然后由类来实例化对象;而在原型语言中,对象以克隆另一个对象的方式创建,被克隆的母体称为原型对象。

  克隆的关键在于语言本身是否为我们提供了原生的克隆方法。在ECMAScript5中,Object.create可以用来克隆对象。

  原型模式的目的并不在于得到一个一模一样的对象,而提供了一种便捷的方式去创建对象(出自《JavaScript设计模式与开发实践》)。但是由于语言设计的问题,JavaScript的原型存在着诸多矛盾,它的某些复杂的语法看起来就那些基于类的语言,这些语法问题掩盖了它的原型机制(出自《JavaScript语言精粹》)。如:

  实际上,当一个函数对象呗创建时,Function构造器产生的函数对象会运行类似这样的一些代码:

  新的函数对象被赋予一个prototype属性,它的值是一个包含constructor属性且属性值为该新函数的对象。当对一个函数使用new运算符时,函数的prototype的属性的值被作为原型对象来克隆出新对象。如果new运算符是一个方法,它的执行过程如下:

  从上面可以看出,虽然使用new运算符调用函数看起来像是使用模板实例化的方式来创建对象,但本质还是以原型对象来克隆出新对象。

JS面向对象编程详解(js面向对象编程思想)

  由于新克隆的对象能否访问到原型对象的一切方法和属性,加上new运算符的特性,这便成了利用原型模拟类式语言的基石。

利用原型模拟类式语言抽象

  用原型模式来模拟类,首先是抽象方式。根据JavaScript语言的特点,通常一个类(实际上是伪类)通常是将字段放置于构造函数(实际上是new 运算符调用的函数,JavaScript本身并没有构造函数的概念)中,而将方法放置于函数的prototype属性里。

继承

  继承是OO语言中的一个最为人津津乐道的概念。许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承之继承方法签名,而实现继承则继承实际的方法。但是ECMAScript中无法实现接口继承,只支持实现继承,而且其实现继承主要是依靠原型链来实现的。(出自《JavaScript高级程序设计》 6.3节——继承)在高三中作者探索了各种关于继承的模拟,如:组合继承、原型继承、寄生继承、寄生组合继承,最终寄生组合式成为所有模拟类式继承的基础。

  高三中只给出了单继承的解决方案,关于多继承的模拟我们还得自己想办法。由于多继承有其本身的困难:面向对象语言如果支持了多继承的话,都会遇到著名的菱形问题(Diamond Problem)。假设存在一个如左图所示的继承关系,O中有一个方法foo,被A类和B类覆写,但是没有被C类覆写。那么C在调用foo方法的时候,究竟是调用A中的foo,还是调用B中的foo?

  所以大多数语言并不支持多继承,如Java支持单继承+接口的形式。JavaScript并不支持接口,要在一个不支持接口的语言上去模拟接口怎么办?答案是著名的鸭式辨型。放到实际代码中就是混入(mixin)。原理很简单:

  值得一提的是dojo利用MRO(方法解析顺序(Method Resolution Order),即查找被调用的方法所在类时的搜索顺序)方式解决了多继承的问题。  

  到此,我们已经清楚了模拟类语言的基本原理。作为一个爱折腾的程序员,我希望拥有自己的方式来简化类的创建:

提供一种便利的方式去创建类,而不暴露函数的prototype属性 在子类中覆盖父类方法时,能够像Java一样提供super函数,来直接访问父类同名方法 以更方便的方式添加静态变量和方法而不去关心prototype 像C#那样支持Attribute   

最终,在借鉴各位大牛的知识总结,我编写了自己的类创建工具O.js:

类创建方式如下:

继承:

标签: js面向对象编程思想

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

上一篇:JS判断字符串字节数并截取长度的方法(js判断字符串字符出现的次数)

下一篇:JavaScript中获取纯正的undefined的方法(javascript中获取字符串长度)

  • 2019年的个税现在还可以退吗
  • 不能从销项税额中抵扣的进项税额都有什么
  • 领用工程物资的账务处理
  • 汇算清缴需补税
  • 增值税征税范围及税率
  • 公司向个人借款是否合法
  • 税务局三代手续费政策
  • 财报一季度
  • 高铁票抵扣税率怎么计算
  • 企业持有到期债券的风险
  • 外商投资企业退出条件
  • 金税盘付费
  • 员工入股怎么分成
  • 外请人员所发生的费用怎么做账
  • 收到返还利润可以抵扣吗
  • 固定资产所取得的成本
  • 如何理解发票开具加税点的说法?
  • 开给学校的发票要税号吗
  • 同一地级行政区怎么划分
  • 优化技巧
  • 财务报告报送与信息采集季报怎么填写
  • 金融公司一般有哪些业务
  • 外币结算方式有哪几种
  • 应纳税所得额计算个税
  • 外派人员计算个人所得税可否有附加扣除
  • 财务转账一般多久到账
  • 开票金额比收入高怎么办
  • win10怎么看电脑名称
  • 以前年度的财务报表还可以找出来吗
  • 偶然所得怎么缴纳个人所得税免税
  • 金钱树的养殖方法和浇水方式
  • 什么是递延所得税资产和负债
  • 想要探究的问题
  • 借条无还款时间怎么办
  • 新准则管理费用税金
  • 房产税会计科目应该走税金及附加还是管理费用
  • laravel框架的优缺点
  • 民办非盈利组织税收政策
  • 个税申报工资比实发工资少,但没超过5000可以举报吗
  • 建行E信通贴现需要什么资料
  • 为什么我的命令提示符里显示user
  • php加密技术
  • 上年度的企业所得税汇算清缴怎么查询
  • 收回多发的工资在上缴财政,可以用应缴财政款科目吗
  • 税务清算后还需要报税吗
  • asp连接sqlserver数据库的三种方式是什么?
  • linux mongodb基本操作
  • 企业收到的国外发票可以入账吗
  • 研发人员的差旅费计入管理费用吗
  • 营业外支出账户核算的主要内容有
  • 建筑企业预缴所得税税率是多少
  • 何为居民企业
  • 作废的发票也要交印花税吗
  • 员工的交通费发票可以报销嘛
  • 暂估费用科目
  • 印花税的减免
  • 定额发票收入怎么样确定
  • 职工教育经费可以结转几年继续抵扣吗
  • 直租业务可以抵房租吗
  • 更换账簿需要注意哪些问题
  • 使用Mysql5.x以上版本出现报错#1929 Incorrect datetime value: '''' for column ''createtime''的快速解决方法
  • Centos系统里screen命令如何使用?Centos系统里screen命令的使用方法
  • centos备份文件夹
  • centos怎么添加用户
  • 班班通一直正在启动什么原因
  • 苹果电脑mac系统怎么升级
  • ubuntu怎么播放视频
  • OS X Yosemite系统怎么样 OS X Yosemite功能介绍
  • centos新建终端快捷键
  • div+css布局是什么
  • jqueryanimate动画
  • 在linux的主要组成部分中最基础的是哪一项?
  • Node.js中 __dirname 的使用介绍
  • Python爬取微信视频号
  • Activity与Theme
  • 12366纳税服务热线工作时间
  • 广东国税局发票查询平台
  • 陕西税务电子税务局官网安装
  • 印花税应税凭证数量是什么意思
  • 发现个人所得税被物业挂职
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设