深入理解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的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确 ...
随机推荐
- oracle dbms_JOB
添加一个任务,怎么老是报错 [SQL] DECLARE job1 number; begin dbms_job.submit(job1,'RESTUDY_SCORE_IMPORT',sysdate,' ...
- cacti结合nagios
使用系统ubuntu12.0.45 监控软件,cacti 使用的是源码安装系统自带的版本过低需要添加插件 nagios采用的系统自带版本 安装nagios apt-get install nagios ...
- iOS开发——加载、滑动翻阅大量图片解决方案详解
加载.滑动翻阅大量图片解决方案详解 今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制. 我要详细说一下,在缩略图界面点击任意小缩略图后,进入高清 ...
- asp.net MVC之 自定义过滤器(Filter) - shuaixf
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以 ...
- ios项目中安装和使用CocoaPods
CocoaPods是什么? http://code4app.com/article/cocoapods-install-usage http://blog.csdn.net/jjmm2009/arti ...
- LeetCode 6 ZigZag Conversion 模拟 难度:0
https://leetcode.com/problems/zigzag-conversion/ The string "PAYPALISHIRING" is written in ...
- (BFS)aoj0558-Cheese
题目地址 根据题意,必须按从1吃到n的顺序.建立vi数组记录去没去过某一点,从起点向四周搜索,合法且未去过就入队列.每当找到符合此时应吃的位置,就将这个位置改为'.'并刷新vi数组,清空队列(因为必须 ...
- windows平台下安装、编译、使用mongodb C++ driver
本博客将记录在Win8.1 ,VS2013环境下编译.配置mongodb C++ driver的流程. 1.下载预备 下载Boost:http://sourceforge.net/projects/b ...
- php序列化和反序列化
一 使用系统函数serialize和unserilazie <?php class A { public $a = "aa"; public $b = 10; functio ...
- VS 工程的 输出路径和工作路径的区别
输出路径,是vs编译项目生成可执行文件的路径:工作路径是环境变量,比如我们在程序中写相对路径,就是以这个路径为基础的.在默认情况下,输出路径和工作路径都不写的话,默认是程序的bin下面的debug或者 ...