介绍Javascript中面向对象编程思想之前,需要对以下几个概念有了解:

1. 浅拷贝和深拷贝:程序在运行过程中使用的变量有在栈上的变量和在堆上的变量,在对象或者变量的赋值操作过程中,大多数情况先是复制栈上的信息,这样就会出现以下情况,如果变量是对象,那么这一操作,复制的只是真正对象所在 的堆内存空间的起始地址,这就是所谓的浅拷贝,如果是深拷贝,则是在内存堆空间中重新分配一个内存,并把分配的内存的起始地址复制过去。

2. 引用类型数据和值类型数据:谈到引用类型数据和值类型数据,自然而然的联想到内存的堆和栈,引用类型的数据真正的内容是存放在内存的堆上的(内存的释放是通过人工的释放或运行时的垃圾回收机制实现的), 而值类型的数据是存放在内存的栈上面的(函数执行完之后,会通过弹出栈的方式释放内存)。实际上大多数的编程语言中赋值操作都是copy内存栈上的内容,但是这一简单的操作对值类型和引用类型之间产生的效果是 有很大不同的,对于值类型的数据而言,这一操作就实现类把真正的值赋值给另外一个变量,对于引用类型的数据而言,这操作只是简单的将真正值的地址信息赋值给另外一个变量,其实际的内容信息是存放在堆上空间 上的。【Javascript中的值类型有:数值,布尔类型,null和undefined等;引用类型有:数组,对象和函数等】

3. Javascript中对象的原型链:Javascript中的所有对象都具有prototype这一属性,而这一属性的本身也是一个对象(同样,它也有prototype属性),如此一层一层向上循环就形成了一个原型链,知道这个原型链到达 Object这一级,而Object的prototype属性为null,此时,原型链就终止了。通过原型链,可以给Javascript中的对象(与其说是对象,不如说是类)添加属性,通过这种方法添加的属性,将会在后期new的所用实例都具用这 些属性。如果添加的属性是值类型话,后期实例化对象的时候,这些属性会在每个实例化的对象中有各自的复制版本,但是如果通过prototype添加的属性是引用类型的话,在后期的实例化的所有对象都共享同一个版本,因 此,通过一个对象操作这一个属性,会同时影响到所有的实例对象。所以,我们应该尽量的不要使用这种方法添加一些"变量"类型的属性,而是尽量的使用该方法添加一些"方法"类型的属性。

你可以尝试通过以下demo程序加深对这一概念的理解:

var innermodel=function(){
this.msge="Init message";
} innermodel.prototype.msge="";
innermodel.prototype.changeMsg=function(newmsge){
this.msge=newmsge;
}; var instance=new innermodel(); function testmodel(inparams){
this.arrtest=inparams;
} testmodel.prototype.innermod=instance; testmodel.prototype.show=function(){
//this.arrtest[0]=6;
alert(this.innermod.msge);
}
testmodel.prototype.arrtest=[]; var testArr=new testmodel([1,2,3,4]);
var testArr2=new testmodel([4,5,6,7]); testArr.show();
testArr.innermod.changeMsg("new mssage");
testArr2.show();

4. Javascript 中对象的constructor属性: Javascript中对象的constructor属性是prototype对象的一个属性,constructor属性通常是用来判断一个对象的类型,在Javascript面向对象编程中继承时候经常使用到。

5. javascript中对象方法(类方法)和原型方法之间的区别:对象方法是通过对象名称直接调用,相当于其他面向对象编程语言中的静态方法,原型方法是通过每个对象(类)实例化一个instance是调用的,也就是说每个对象实例化一个instance都会 有自己的复制版本(注意这里的复制,只是浅复制,复制的只是方法的地址,而真正的方法体在内存中只有一份)。

6. Javascript中原型链的访问流程,使用实例化的对象访问属性或方法时候,如果引用的方法或者属性不属于该对象的方法或属性,则会向上查找该方法或属性是否属于其原型链上某个对象的方法或者属性,知道找到匹配的 或者到达原型链的顶端(即prototype为null,Object的prototype就是null),Javascript面向编程中经常使用该方法来实现继承。

深入理解javascript中实现面向对象编程方法的更多相关文章

  1. JavaScript中的面向对象编程,详解原型对象及prototype,constructor,proto,内含面向对象编程详细案例(烟花案例)

    面向对象编程:   面向:以什么为主,基于什么模式 对象:由键值对组成,可以用来描述事物,存储数据的一种数据格式 编程:使用代码解决需求   面向过程编程:         按照我们分析好的步骤,按步 ...

  2. JavaScript 中的面向对象编程

    使用JSON 来定义一个对象: <script type="text/javascript">var xiaoming = { name : 'xiaoming', a ...

  3. 如何理解并学习javascript中的面向对象(OOP) [转]

    如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于 jquery的插件).那么,你请务必要学习javascript ...

  4. 前端开发:面向对象与javascript中的面向对象实现(一)

    前端开发:面向对象与javascript中的面向对象实现(一) 前言: 人生在世,这找不到对象是万万不行的.咱们生活中,找不到对象要挨骂,代码里也一样.朋友问我说:“嘿,在干嘛呢......”,我:“ ...

  5. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  6. 聊Javascript中的AOP编程

    Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...

  7. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  8. javaScript设计模式之面向对象编程(object-oriented programming,OOP)(二)

    接上一篇 面向对象编程的理解? 答:面向对象编程,就是将你的需求抽象成一个对象,然后针对这个对象分析其特征(属性)与动作(方法).这个对象我们称之为类.面向对象编程思想其中一个特点就是封装,就是把你需 ...

  9. 灵活的理解JavaScript中的this指向(一)

    this是JavaScript中的关键字之一,在编写程序的时候经常会用到,正确的理解和使用关键字this尤为重要.首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确 ...

随机推荐

  1. HttpContext.GetOwinContext().Authentication 报错 解决办法

    HttpContext.GetOwinContext().Authentication 会提示 不包含GetOwinContext 方法的报错信息 解决办法:引入system.web程序集,GetOw ...

  2. 【IE6双倍边距】-IE6双倍边距的bug

    效果 代码 CSS IE6双倍边距的bug body { margin: 0; padding: 0; } .div1 { width: 200px; height: 200px; backgroun ...

  3. WebPack 简明学习教程

    WebPack 简明学习教程 字数1291 阅读22812 评论11 喜欢35 WebPack是什么 一个打包工具 一个模块加载工具 各种资源都可以当成模块来处理 网站 http://webpack. ...

  4. React Native + Nodejs 使用RSA加密登录

    想用rn做个RSA(非对称加密)登录 基本流程就是在服务端生成RSA后,将“公钥”发到客户端,然后客户端用“公钥”加密信息发送到服务端,服务务端用私钥解密. 过程不复杂,问题在于,nodejs和rn都 ...

  5. PO VO DAO DTO BO TO概念与区别(转)

    O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R Mapping的世界里,有两 ...

  6. Hollister Outlet Store

    (link to hollisterco site), It's a major try. After a photographer's viewpoint, Which roughly splend ...

  7. HalconMFC(三)之打开图像_简单处理

    在VS2010中配置完halcon之后就得写个最简单的程序满足一下咱们的自信心呀! 第一步,新建MFC程序 最好是按照下面这么设置然后点击"完成",就不会报错 第二步,导出C++代 ...

  8. 用PowerMock mock final类constructors

    也相对简单,直接贴代码 被测方法 public class EmployeeServiceWithParam { public void createEmployee(final Employee e ...

  9. linux下如何使用sftp命令

    sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载,以及一些相关操作. 举例,如远程主机的 IP ...

  10. c/c++程序员必须要掌握开源项目

    作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...