js 原型的内存分析
使用构造器的弊端:http://www.cnblogs.com/a757956132/p/5258897.html 示例
将行为设置为全局的行为,如果将所有的方法都设计为全局函数的时候,
这个函数就可以被window调用,此时就破坏了对象了封装性,
而且如果某个对象有大量的方法,就会导致整个代码充斥着大量的全局函数 ,这样将不利于开发
为解决构造的方法是通过原型来解决问题i
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title> <script type="text/javascript"> /**
* 原型是js中非常特殊的一个对象,当一个函数创建之后,会随之就随之产生一个原型对象
* 当通过这个函数的构造函数创建了一个具体的对象之后,在这个具体的对象中就会有一个属性指向原型
*/
//第一种状态
/**
* function Person(){},Person函数中有一个prototype的属性指向Person的原型对象,在原型
* 对象中有一个construction的属性指向了Person函数,所以可以通过new Person()创建对象
*/
function Person(){ }
//
//第二种状态
/**
* 通过Person.protype.name为原型设置值之后,这些属性和方法都是设置在Person的原型中的
*/
Person.prototype.name = "Leon";
Person.prototype.age = 23;
Person.prototype.say = function(){
console.info(this.name + " " + this.age);
} //第三种状态,创建了一个对象之后会有一个_prop_的属性指向原型
//在使用时如果在对象内部没有找打属性会去原型中找,_prop_属性是隐藏的
/**
* 当使用Person创建了对象之后,会在对象中有一个_porp-属性(这个属性是不能被访问的)指向了原型,
* 当使用对象调用原型的时候,首先会在对象的内部找是否有这个属性,如果没有会通过_prop_去原型中找属性,
* 所以当调用p1.say(),在自己的空间中不存在这个方法,就会去原型中寻找,找打之后完成say的调用。
*/
var p1 = new Person();
p1.say(); //Leon 23 //以下方法可以检测p1是否有_prop_指向Person的原型
console.info(Person.prototype.isPrototypeOf(p1)); //true //第四种状态
/**当创建了一个新的p2之后,依然会有一个_porp_属性指向Person的原型,此时如果通过p2.name
* 设置了属性之后,会在对象自己的内存空间中存储name的值,当调用say方法的时候在寻找name时,
* 如果在自己的内存中找到之后,就不会去原型中查找了(特别注意:原型中的值不会被替换,仅仅只是在查找时被覆盖)
* 查找时会先在自己的空间内存中查找,如果查找不到才会到原型中查找
*/
var p2 = new Person();
//是在自己的空间中定义了一个属性,不会替换原型中的属性
p2.name = "Ada";
p2.say(); //Ada 23 //检测某个对象是否是某个函数的原型
console.info(Person.prototype.isPrototypeOf(p2));// true //检测某个对象的constructor指向
console.info(p1.constructor == Person);// true //检测某个属性是否是自己的属性
console.info(p1.hasOwnProperty("name")); //false p1自己的空间中没有值
console.info(p2.hasOwnProperty("name")); //true p2在自己空间中设置了name //可以通过delete删除自己空间中的属性
delete p2.name;
p2.say(); //Leon 23
console.info(p2.hasOwnProperty("name"));//false 由于已经删除,就为false //检测某个对象在原型或者自己中是否包含某个属性,通过int检测
console.info("name" in p1); //true
console.info("name" in p2); //true
console.info("address" in p1); //false 在原型和自己的空间中都没有 console.info(hasPrototypeProperty(p1,"name"));
console.info(hasPrototypeProperty(p2,"name"));
/**
* 可以通过如下方法检测摸个属性是否在原型中存在
*/
function hasPrototypeProperty(obj,prop){
return (!obj.hasOwnProperty(prop) && (prop in obj))
} </script> </head>
<body> </body>
</html>
js 原型的内存分析的更多相关文章
- js高级-变量内存分析
var a = 9, b, c={age:9}, d; b = a; b = 19; console.log(a) console.log(b) d = c; d.age = 22; console ...
- JS内存泄漏 和Chrome 内存分析工具简介(摘)
原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - AR ...
- js原型
1.js基本类型和对象类型 js的简单类型包括数字(其中NaN为数字类型).字符串(类似'A'为字符,js没字符类型).布尔值.null值和undefined值.其他所有的值都是对象.数字.字符串和布 ...
- 简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
- Chrome开发者工具之JavaScript内存分析
阅读目录 对象大小(Object sizes) 对象的占用总内存树 支配对象(Dominators) V8介绍 Chrome 任务管理器 通过DevTools Timeline来定位内存问题 内存回收 ...
- [转载]JavaScript内存分析
https://github.com/CN-Chrome-DevTools/CN-Chrome-DevTools/blob/master/md/Performance-Profiling/javasc ...
- js原型解析
我们都知道javascript因为具有了继承以及变量等等一系列的特性之后才被人们认为具有一门编程语言的资格,在后续的不断发展中,js在原生的基础上扩展了基于jquery等等的库,甚至衍生了像node. ...
- 深入理解JS原型链与继承
我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...
- js 原型链和继承(转)
在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...
随机推荐
- Android 开源项目DiskLruCache 详解
有兴趣的同学可以读完这篇文章以后 可以看看这个硬盘缓存和volley 或者是其他 图片缓存框架中使用的硬盘缓存有什么异同点. 讲道理的话,其实硬盘缓存这个模块并不难写,难就难在 你要考虑到百分之0.1 ...
- Karel运行环境配置
1.下载 见http://wenku.baidu.com/view/24762ced998fcc22bcd10d5e.html 2.界面空白问题 问题:运行Karel后,发现整个界面空白一片,没有任何 ...
- 如何制作和部署war包
通常的网站,很多是以war包形式发布的下边介绍如何自行制作war包 首先要求制作war包的环境安装j2sdk-1.4.2以上版本比如,安装了Plesk的服务器,就都已经具有了j2sdk切换到j2sdk ...
- Checked Exception与Runtime Exception 的区别
Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况.而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别. 首 ...
- python的使用环境总结
python在linux上运行,使用的是vim,每次都是敲四个空格进行缩进,真尼玛的蛋疼,书本果然是个好东西,从而根据书本python高级编程中的设置配置而来: 1.进行自动补全的脚本 [root@p ...
- Android4.4 耳机检测分析
在ALSA架构中,ASOC是由3个部分组成:Platform.CODEC & Machine.而耳机检测一般是在Machine driver里实现,当然也可以在CODEC driver里实现. ...
- String - 兴趣解读
个优点: . 以下代码的HashCode是否相同,它们是否是同个对象: . 以下代码的HashCode是否相同,他们是否是同个对象: . 以下代码的HashCode是否相同,他们是否是同 ...
- JavaScript的function对象
我必须先说Java与JavaScript没有关系,不是我以前想的那个样子的(JavaScript是Java的一种超进化) 在JavaScript中,函数(function)就是对象. JavaScri ...
- LINQ标准查询操作符(三)——Aggregate、Average、Distinct、Except、Intersect、Union、Empty、DefaultIfEmpty、Range、Repeat
七.聚合操作符 聚合函数将在序列上执行特定的计算,并返回单个值,如计算给定序列平均值.最大值等.共有7种LINQ聚合查询操作符:Aggregate.Average.Count.LongCount.Ma ...
- leveldb
[LevelDB] LevelDB is a fast key-value storage library that provides an ordered mapping from string k ...