已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
浅谈javascript面向对象我们常用的两种编程模式POP-面向过程编程(Process-oriented programming) 面向过程编程是以功能为中心来进行思考和组织的一种编程方法,它强调的是系统的数据被加工和处理的过程,在程序设计中主要以函数或者过程为程序的基本组织 方式,系统功能是由一组相关的过程和函数序列构成。面向过程强调的是功能(加工),数据仅仅作为输入和输出存在。这种过程化的思想是一种很朴素和普遍的思 想和方法,人类很多活动都是这种组织模式,比如工厂生产,企业服务等。面向过程以数据的加工处理过程为主线,忽略了过程的所属、边界和环境,混淆了服务功 能和自我功能(比如人可以砍树,这就是一种服务功能,有输入也有输出;它可以提供给外部,而行走,则是自我功能,没有输入也没有输出),外部环境和内部组 织,以及环境数据和原料性数据之间的区别。从思维上来讲,面向过程更强调细节,忽视了整体性和边界性,但这与现实世界有很大的出入,因为现实世界中,这种过程都不是孤立存在的,而是从属于某个对象,因此,面向过程虽然反映了现实世界的而一个方面(功能),但无法更加形象的模拟或者表示现实世界。比如如下这种写法:function A() function B() A();感觉互相之间独立存在的OOP-面向对象编程(Object Oriented Programming) 世界是由一个个对象组成的,因此面向对象的思维方式更加接近现实世界,面向对象编程的组织方式也更加贴近现实世界。面向对象以对象为中心,将对象的内部组织与外部环境区分开来,将表征对象的内部属性数据与外部隔离开来,其行为与属性构成一个整体,而系统功能则表现为一系列对象之间的相互作用的序列,能更加 形象的模拟或表达现实世界。在编程组织中,对象的属性与方法不再像面向过程那样分开存放,而是视为一个整体(程序的最终实现其实还是分离的,但这仅仅是物 理实现上的,不影响将对象的这两个部分视为一个整体),因此具有更好的封装性和安全性(表征内部的属性数据需要通过对象的提供的方法来访问)。面向对象强 调的是整体性,因此面向对象与面向过程在很多方面是可以互补的。同时由于对象继承和多态技术的引入,使得面向对象具有更强、更简洁的对现实世界的表达能 力。从而增强了编程的组织性,重用性和灵活性。比如如下这种写法: View Code 这种看起来就有点OO的感觉了,把属性和方法封装在一个对象里面。面向对象的开发模式是逐渐流行起来,且被开发者们广泛推广的模式。 Javascript是一门基于对象的语言,但它不是一种真正的面向对象编程(OOP)语言,对象的属性都是以键值对的形式存在的,就是平时我们所说的数据字典。把对象的属性和方法封装在一个对象里面,一般通过四种方式:原始对象,构造函数,原型模式,构造函数和原型混合模式。我个人认为面向对象的写法让系统更具有可维护性,可扩展性,可重用性,还有可配置性,功能模块也让人感觉一目了然。下面来讲一下关于javascript对应的OOP的封装,继承,多态三大特性对象的封装 (1)对象字面量或者实例化对象模式 View Code或者Var obj=new Object();Obj.id=;.Obj. renderView.这种封装方式比较简单, 最常用的一种模式,简洁明了,适用于简单的封装.这两种写法,推荐字面量的方式。(2) 构造函数模式 View Code这种方式和C#的构造函数方式类似,每次实例化,所有的元素和方法都被重新创建,重新分配内存,互不影响 ,缺点在于实例化时公有的方法指向不同的地址,造成不必要的浪费,性能欠佳 ,方法应该共享才对,下面的混合模式会讲到。(3)原型prototype View Code 这种方式的特点是所有的在原型链上的方法都是共享的,并且指向同一个地址。这里需要注意,如果原型链上面一个属性对应的是object对象会有一个问题,就是在一个实例对象里面给这个对象的属性赋值会影响另一个实例对象.var a=new MyPlugin();var b= new MyPlugin();=bbbbbbbb这样在b中的obj对象的name值会被改变。原因是这里的obj是引用类型,a.obj和b.obj指向的是同一个地址,如果是值类型则不会存在这样的问题(4)构造函数和原型混合模式这种模式的意义在于实例化的时候保持属性的相互独立,只共享方法.在做封装的时候推荐使用这种方式.刚才我们所说的构造函数的缺点和原型模式的缺点在这里得到改善。 View Code(5) 其他写法 View Code或者 View Code 刚才我们提到构造函数模式实例化之后对象的方法地址指向不一样,而原型模式,地址指向一致的说法。我们来看一下:复制代码var funcDemo=function (name) funcDtotype.init=function()var a=new funcDemo(aaa);var b=new funcDemo(bbb);console.log(a.init=b.init);复制代码 输出结果是true.再来看看构造函数:复制代码var funcDemo=function (name) this. Init=function() var a=new funcDemo(aaa);var b=new funcDemo(bbb);console.log(a.init=b.init);复制代码 输出结果是false. 对象的继承性1.call ,apply复制代码var funcA = function() this.show = function() console.log(funcA); var funcB = function() funcA.call(this);var b = new funcB();b.show();复制代码在这里 funcA.call(this);这句相当于是在funB的内部里面执行了this.show=function() console.log(funcA); 而当前的作用域在funcB内部,this指向的是funB的实例化对象,也就是把show方法赋值给了funcB的实例化对象有一点需要注意,如果是直接执行funcB(),那么当前作用域就是window了,相当于把show方法赋值给了window。等同于window.show=function() console.log(funcA);2.原型继承复制代码var funcA = function() this.show = function() console.log(funcA); var funcB = function() funcB.prototype = new funcA();var b = new funcB();b.show();复制代码这一句 funcB.prototype=new funcA();相当于把funB的原型指向了funcA的实例等同于 funcB. Prototype= Show:function() console.log(funcA); 我们可以写一个函数来实现继承复制代码var extend = function(fn, newfn) var F = function () ;F.prototype = totype;totype = new F();totype.constructor = newfn;totype.superClass =totype复制代码3.属性拷贝我们先实现属性拷贝的代码:复制代码var DeepCopy = function(newobj, obj) for(var prop in obj) if(obj.hasOwnProperty(prop) var item = objprop; if(Ototype.toString.call(item) = object Object) newobjprop = ; arguments.callee(newobjprop, item); else if(O prototype.toString.call(item) = object Array) newobjprop = ; arguments.callee(newobjprop, item); else newobjprop = item; return newobj;复制代码然后将A对象里的属性赋给B对象 :复制代码var A = obj: name: AAAA , Arr: name: AAAA , name: BBBB var B = name: BBBBBBBBBBDeepCopy(B, A)复制代码对象的多态性和其他语言一样 ,先定义一个基类,js不存在类的概念,这里我只是类比的说法.var baseClass=function() this.init=function() this.test.apply(this,arguments); 这里执行init其实是执行了子类的test方法我们再定义A类,B类复制代码var A=function() this.test=function() alert(AAAAAAAAAA); var B=function() this.test=function() alert(BBBBBBBBBBBBB); 复制代码然后将A类,B类的原型指向baseClass的实例,就是我们刚才说的原型继承 A.prototype=new baseClass(); B.prototype=new baseClass();最后我们实例化
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 简易租房合同
- 2025-2030智能别墅行业市场现状供需分析及投资评估规划分析研究报告
- 物流承包合同
- 五金电料合同
- 和租户签合同
- 2025年超声诊断笔记题库及答案
- 2025年飞行员执照考试《商用驾驶员直升机》综合练习题及答案三
- 2025年飞行员执照考试《商用驾驶员直升机》综合试题及答案三
- 监理员工作总结及计划
- 2025年麻醉专科护士考试题及答案
- 《粤港澳大湾区发展规划纲要》(双语全文)
- 企业员工意外险采购招标书
- 化工装置拆除合同
- 肥料、农药采购服务方案投标文件(技术标)
- 20以内的加法口算练习题4000题 205
- 小学生经典阅读英语短文100篇
- 行贿受贿检讨书
- T-CCIIA 0004-2024 精细化工产品分类
- 组织工作中国家秘密及其密级具体范围的规定
- 循环系统-解剖结构
- 传输原理课后习题答案
评论
0/150
提交评论