标签:style class blog c code java
/** */
"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的内存模型的测试"; };/**
/**
* 然后,我们利用上面的简单例子在说明一下
*
*/
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
标签:style class blog c code java
原文地址:http://blog.csdn.net/u012332735/article/details/26620249