javascript内存模型分析猜想

/*

* 这里我是利用分析java内存模型的方法来猜想javascript的内存模型,

* 由于没有看到国内有关于分析javascript的书籍,但是可以借鉴java的

* 内存模型结构来帮助理解javascript的内存模型中的原型机制,下面先

* 给出一个简单的原型例子

* */

"use strict";
function PrototypeModel(name,author,time){

}
PrototypeModel.prototype.name  = "PrototypeModel";
PrototypeModel.prototype.author = "felayman";
PrototypeModel.prototype.time = "2014-5-22";
PrototypeModel.prototype.getInfo = function(){
   return "关于对javascript的内存模型的测试";
};

/**

* 例子很简单,只是为一个函数增加几个原型属性,下面开始利用java的

* 内存模型来说明javascript,看是否可以解释出其原型思想

*

* 在java中,引用类型变量和基本类型变量是存储在栈上,而对象则是存储

* 在堆内存中,而关于加载到堆内存中的实例对象所属类的信息则是保存到

* Class实例对象中,虽然Class实例也是对象,但是它并不保存在堆内存中

* 而是存放到方法区中(详细内容参考深入立即JVM一书),而方法区中则保存

* 类的一些静态属性和类的信息,那么我们是否可以理解,在javascript中

* 函数能否理解为javascript中的类呢?虽然它们的名称不同,但是还是有

* 很多相同的地方,因为它们都充当着对象实例的模板,即类.因为javascript

* 是属于函数式编程的语言,是基于面向对象的语言,因此又可以避免类这个概念.

* 因此,我们在javascript中,是否可以理解函数就是实例对象的元信息呢?如果

* 可以的话,完全可以向java一样,把元信息存储在方法区中,如下图:

*/

/**

* 然后,我们利用上面的简单例子在说明一下

*

*/

function print(s){document.write(s+"<br/>")};
var prototypeObj1 = new PrototypeModel();
var prototypeObj2 = new PrototypeModel();
var prototypeObj3 = new PrototypeModel();

print(prototypeObj1.name+"---"+prototypeObj1.author+"---"+prototypeObj1.time);
print(prototypeObj2.name+"---"+prototypeObj2.author+"---"+prototypeObj2.time);
print(prototypeObj3.name+"---"+prototypeObj3.author+"---"+prototypeObj3.time);

其结果简单明了,

其内存模型,分析如下图

这样,我们可以把存放函数原型的区域称为函数区,这个区域是存放javascript内置函数原型和自定义函数原型的区域,当我们使用了内置函数或者自定义函数的时候,系统会

给每个实例对象(javascript中的函数实例就是对象)分配一个名称为prototype的属性,该属性也是一个引用类型(也许叫句柄更合适),但是该引用类型并不存放在栈中,而是保存在堆内存实例对象中的键值对中(因此,javascript中的对象其实就是由多个键值对组成的序列集合,),但是prototype属性中保存的是在函数区中的一个对象,该对象是Prototype的实例(类似于java中的Class实例),该实例保存着PrototypeModel函数的原型对象,因此我们在声明PrototypeModel函数后,不管我们new多少个PrototypeModel的实例,每个实例都会有prototype属性,该属性指向PrototypeModel原型,因此,可以断定javascript中的函数区是线程共享区域的,但是当我们为实例对象赋予属性的时候,情况就会发生变化,如下:

var prototypeObj4 = new PrototypeModel();
prototypeObj4.name = "felayman";
prototypeObj4.author  ="felay";
prototypeObj4.time = "1999-9-9";
print(prototypeObj4.name+"---"+prototypeObj4.author+"---"+prototypeObj4.time);

其结果如图:

这个时候,我们为prototypeObj4实例对象赋予的属性都存放在该实例对象的内存中,而不是存放在函数区中,因此是属于线程私有的,但是很不幸,我们赋予的属性名称和原型中的属性名称重叠了,因此实例对象原有属性值会区覆盖原型中的属性值.才会出现上述的内容.

javascript内存模型分析猜想,布布扣,bubuko.com

时间: 2024-10-18 16:05:00

javascript内存模型分析猜想的相关文章

java内存模型分析2

不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成,线程.主内存和工作内存的交互关系如下图所示,和上图很类似. 这里的主内存.工作内存与Java内存区域的Java堆.栈.方法区不是同一层次内存划分.!!!! 这里的主内存.工作内存与Java内存区域的Java堆.栈.方法区不是同一层次内存划分.!!!! 3.2 内存间交互操作 关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存.如何从工作内存同步到主内存之间的实现细节,Java内存模型定

Java内存模型分析

在学习Java内存模型之前,先了解一下线程通信机制. 1.线程通信机制 在并发编程中,线程之间相互交换信息就是线程通信.目前有两种机制:内存共享与消息传递. 1.1.共享内存 Java采用的就是共享内存,本次学习的主要内容就是这个内存模型. 内存共享方式必须通过锁或者CAS技术来获取或者修改共享的变量,看起来比较简单,但是锁的使用难度比较大,业务复杂的话还有可能发生死锁. 1.2.消息传递 Actor模型即是一个异步的.非阻塞的消息传递机制.Akka是对于Java的Actor模型库,用于构建高并

JavaScript学习系列之内存模型篇

一个热爱技术的菜鸟...用点滴的积累铸就明日的达人 正文 如果真的想学好一门语言,那么一定要了解它内存模型,本篇文章就带你走进JavaScript的内存模型,由于本人才疏学浅,若有什么表述有误的地方,欢迎各位看官能够指点一二,在此不胜感激... 在阅读这边文章之前,默认您已经掌握了JavaScript的基本概念.栈堆等基本数据结构以及计算机基本理论基础,如有了解欠缺,请移步相关博客后再阅读本文. 一.基本的数据类型的内存结构 首先粗略的介绍一下JavaScript中五种基本的数据类型Undefi

计算机内存模型 粗浅理解

对于计算机内存模型,我认为可按 数组 模型进行类比.将计算机的内存结构等同于 数组 存储结构(其实这里反过来才是正确的,数组存储的模型是依照计算机的内存模型进行存储的,但这里为了更容易理解,就将其反过来思考). 一般而言,对于不同的机器,其内存高低字节存储位置可能不同,这就是所谓的大端小端.这也给我们的理解带来困惑. 而在我的机器上,我测试出来的结果是:以竖直内存模型分析,低地址在上,高地址在下方. 验证程序: #include "stdafx.h" #include <iost

Java内存模型JMM简单分析

参考博文:http://blog.csdn.net/suifeng3051/article/details/52611310 http://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html    http://www.cnblogs.com/dolphin0520/p/3613043.html 一.Java内存区域的划分 由于Java程序是交给JVM执行的,所以我们在谈Java内存区域分析的时候事实上是指JVM内存区域划分. 根

【死磕Java并发】-----Java内存模型之分析volatile

前篇博客[死磕Java并发]-–深入分析volatile的实现原理 中已经阐述了volatile的特性了: volatile可见性:对一个volatile的读,总可以看到对这个变量最终的写: volatile原子性:volatile对单个读/写具有原子性(32位Long.Double),但是复合操作除外,例如i++; JVM底层采用"内存屏障"来实现volatile语义 下面LZ就通过happens-before原则和volatile的内存语义两个方向介绍volatile. volat

转:【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313 happen-before规则介绍 Java语言中有一个"先行发生"(happen-before)的规则,它是Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,其意思就是说,在发生操作B之前,操作A产生的影响都能被操作B观察到,"影响"包括修改了内存中共享变量的值.发送了消息.调用了方法等,它与时间上的先后发生基本没有

Chrome开发者工具之JavaScript内存分析

内存泄漏是指计算机可用内存的逐渐减少.当程序持续无法释放其使用的临时内存时就会发生.JavaScript的web应用也会经常遇到在原生应用程序中出现的内存相关的问题,如 泄漏和溢出,web应用也需要应对 垃圾回收停顿. 尽管JavaScript使用垃圾回收进行自动内存管理,但有效的(effective)内存管理依然很重要.在这篇文章中我们将探讨分析JavaScript web应用中的内存问题.在学习有关特性时请确保尝试一下相关案例以提高你对这些工具在实践中如何工作的认识.请阅读 内存 101(M

Chrome开发者工具之JavaScript内存分析(转)

尽管JavaScript使用垃圾回收进行自动内存管理,但有效的(effective)内存管理依然很重要.在这篇文章中我们将探讨分析JavaScript web应用中的内存问题.在学习有关特性时请确保尝试一下相关案例以提高你对这些工具在实践中如何工作的认识.请阅读内存 101(Memory 101)页面来帮助你熟悉这篇文章中用到的术语.注意:我们将要用到的某些特性目前仅对Chrome Canary版浏览器可用.我们推荐使用这个版本来获得最佳的工具,以分析你的应用程序的内存问题. 你需要思考的问题