深入理解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的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确 ...
随机推荐
- pwnable.kr-flag
题目: 使用 file 命令查看下载回来的 flag 文件,发现是一个64位的 ELF 可执行程序.通过查看,发现其具有明显的 UPX 压缩标志,所以解压之. 使用命令upx –d 进行脱壳,如果没有 ...
- WCF传输图片解决方案
图片无法序列化后传输,但我们可以将图片转二进制字符串传输.然后在服务端将二进制字符串转图片. 将图片转字符串的例子: private byte[] BmpToJpegBuff(Image img) { ...
- MicroERP更新记录2.2:增加B/S查询功能
提供电脑版及手机版两种浏览方式,仅仅作为一个DEMO展示,由于系统内置报表比较复杂,待广泛收集用户需求之后再逐步完善. 网页文件在安装包内web文件夹中. 下载地址:60.2.39.130/micro ...
- Xcode中的Version和Build的区别
Version( 应用程序发布版本号 ) Version对应的是CFBundleShortVersionString. Version 一般由产品部门确定,版本号是由分隔的整数组成的字符串,一般有2段 ...
- DLL 导出封装类
首先使用Wizard创建一个Win32 Dynamic-Link Library工程,然后定义一个简单的C++类CInDLL.由于该类会被工程之外的文件所引用,所以需要对这个类进行引出.因为只有引出后 ...
- 用PowerMock mock 由工厂方法产生的对象
有些对象需要mock的对象是由工厂方法产生出来的,而工厂方法一般是静态方法,这时候就需要同时mock工厂方法及对象 被测方法: public class EmployeeServiceFactory ...
- java基础之 超类Object
一.概述: Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法.在不明确给出超类的情况下,Java会自动把Object作为要 ...
- maven下载速度慢的解决方法(转)
原文链接:http://blog.csdn.net/u013009618/article/details/53980983 maven是支持镜像的,我们可以在maven的conf文件加下的settin ...
- greendao 3.1.0在android studio中配置
1 项目根build.gradle classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0' 2 app中build.gradle apply p ...
- OGG for DB2 i 12.2发布
2016-04-15 Oracle发布了GoldenGate for DB2 i 12.2.0.1.2,软件可以从OTN 或 eDelivery下载.这是第一个针对DB2 for i的12.2版本.此 ...