深入理解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的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确 ...
随机推荐
- 为更好地设计数据库,重新整理sql server数据类型
我们在平常开发过程中,在设计数据的时候,经常碰到数据类型选择的问题,为了更快,更合适地选择正确的数据类型,所以在这里做个总结. 分类 sql server 数据类型 c# 数据类型 描述 应用场景 字 ...
- [CentOS] 解决 crontab 无法读取环境变量的问题
参考资料:http://blog.slogra.com/post-238.html 1. 问题描述 一段数据处理的 shell 程序,在 shell 中手动运行,可以正确执行.但是,把它放在 cron ...
- hibernate入门实例
1. 环境配置 1.1 hiberante环境配置 hibernate可实现面向对象的数据存储.hibernate的官网:http://hibernate.org/ 官网上选择hibernate OR ...
- Volley的GET和POST方法
首先记得加上权限 <uses-permission android:name="android.permission.INTERNET"/> XML代码 <?xm ...
- 查找“asdfjvjadsffvaadfkfasaffdsasdffadsafafsafdadsfaafd” 该字符串中有多少个af
package lovo.bean; import java.util.Scanner; public class Java { @param args public static void main ...
- 4、jvm内存回收——器
内存回收---->垃圾回收---->GC GC 三基础,一个综合G1 串行:单线程,回收暂停其他 并行:多线程,回收暂停其他 并发:多线程,回收不暂停?! 成功好说,失败Serial Ol ...
- java常用基础知识点 (持续追加)
作为一个Java编程人,会经常用上JDK中的大量的API类库,常用的有字符串操作.集合操作.文本操作.输入输出操作.以及网络操作, 常用的包: 1. java.lang Java程序的基础类,字符串, ...
- c# 第一个实例 通哥
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 作业七:团队项目——Alpha版本冲刺阶段010
今日安排:组内成员讨论 今日进程:组内成员讨论结束,并有明确的解决办法,每个人准备实践
- shared_ptr和多线程
前一篇文章写得实在太挫,重新来一篇. 多线程环境下生命周期的管理 多线程环境下,跨线程对象的生命周期管理会有什么挑战?我们拿生产者消费者模型来讨论这个问题. 实现一个简单的用于生产者消费者模型的队列 ...