深入理解javascript中实现面向对象编程方法
介绍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中实现面向对象编程方法的更多相关文章
- JavaScript中的面向对象编程,详解原型对象及prototype,constructor,proto,内含面向对象编程详细案例(烟花案例)
面向对象编程: 面向:以什么为主,基于什么模式 对象:由键值对组成,可以用来描述事物,存储数据的一种数据格式 编程:使用代码解决需求 面向过程编程: 按照我们分析好的步骤,按步 ...
- JavaScript 中的面向对象编程
使用JSON 来定义一个对象: <script type="text/javascript">var xiaoming = { name : 'xiaoming', a ...
- 如何理解并学习javascript中的面向对象(OOP) [转]
如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于 jquery的插件).那么,你请务必要学习javascript ...
- 前端开发:面向对象与javascript中的面向对象实现(一)
前端开发:面向对象与javascript中的面向对象实现(一) 前言: 人生在世,这找不到对象是万万不行的.咱们生活中,找不到对象要挨骂,代码里也一样.朋友问我说:“嘿,在干嘛呢......”,我:“ ...
- 简单分析JavaScript中的面向对象
初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...
- 聊Javascript中的AOP编程
Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...
- 理解JavaScript中的原型继承(2)
两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...
- javaScript设计模式之面向对象编程(object-oriented programming,OOP)(二)
接上一篇 面向对象编程的理解? 答:面向对象编程,就是将你的需求抽象成一个对象,然后针对这个对象分析其特征(属性)与动作(方法).这个对象我们称之为类.面向对象编程思想其中一个特点就是封装,就是把你需 ...
- 灵活的理解JavaScript中的this指向(一)
this是JavaScript中的关键字之一,在编写程序的时候经常会用到,正确的理解和使用关键字this尤为重要.首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确 ...
随机推荐
- Git bash使用中...
理解Head指向分支及标签tag Head指向当前分支(如master),可以把每次提交完成的修改看成一个圈,在修改上可以开另一分支为接下来的修改做准备,未修改前新建的分支与当前分支可看成绕修改圈转: ...
- ldconfig和ldd用法
一.ldconfig ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig. ldconfig 命令的用途,主要是在默认搜寻目录(/ ...
- 关于java对Excel的读取
/*注意:读取的Excel文件 请另存为2003版本的Excel,否则可能会报错别忘记导入第三方的jar包*/package com.zzp.ExcelParse;import jxl.Cell;im ...
- web移动端资源整(1)
meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-wid ...
- Java中的弱引用
Strong references StringBuffer buffer = new StringBuffer(); 普通的对象创建都是这种类型,只要buffer还存在,对象就不会被GC回收.同时也 ...
- 翻转和翻页效果TextFile的几种自定义例子
前一篇文章,已经介绍了BMR的基础用法,再结合Spark和Scala的文档,我想应该是可以开始你的数据分析之路的.这一篇文章,着重进行一些简单的思路上的引导和分析.如果你分析招聘数据时,卡在了某个环节 ...
- 高斯过程(gaussian process)
Definition 1. A Gaussian Process is a collection of random variables, any finite number of which hav ...
- js回顾1
1.正则:/^[0-9a-zZ-Z_]*&/ //匹配0到多个,+是1到多个,?0或多个,.任意值/^[0-9a-zZ-Z_]{6,}&/ //精确到至少6位\w查找单词字符检测:te ...
- DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版原创发布-带官方示例程序版
关于 DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版------------- ...
- Win7 64位ORACLE取数字乱码的解决
参见网址http://www.2cto.com/database/201304/201767.html 首先是PLSQL DEVELOPER 直接报错 NLS_LANG 错误 第一步是在命令行下测试 ...