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 ...
随机推荐
- 如何自定义一个优雅的ContentProvider
最近在code review的时候发现很多人的provider定义的不是很好,写的很粗糙 以至于代码健壮性不够好,可读性也不强 但是你既然写了content provider 就是要给别人调用的,如果 ...
- Android高手进阶教程(五)之----Android 中LayoutInflater的使用!
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://weizhulin.blog.51cto.com/1556324/311450 大 ...
- myeclipse 打开xml jsp页面慢 有时候会自动退出
Myeclipse默认打开文件的方式是 jsp design,每次双击或者使用Ctrl+Shift+R打开 就会用这个打开 ,太慢了而且多次导致Myeclipse挂掉.可以通过以下的方式转化成你想要的 ...
- MVC和WebApi 使用get和post 传递参数。
我们总结一下用js请求服务器的传参方法. Get方式 Get主要是用来查询,一般分为无参,一个参数,多个参数,实体对象参数. 1.无参 //Get没有参数 var get_f1 = function( ...
- C# 导出一个控件的矢量图
调用Control.DrawToBitmap(Bitmap) 方法是很容易得到控件的图形的. 但是bitmap是栅格化图形.栅格化图形有很多缺点,比如文件体积比较大. 放大后失真. 不易编辑等等. 这 ...
- N人报数第M人出列游戏问题(约瑟夫问题)
这是一道华为的机试题,后来才知道也叫约瑟夫问题,题目是这样的:有n个人围成一圈,玩一个游戏,规则为将该n个人编号为1,2,......n, 从编号为1的人开始依次循环报数,报道第m的时候将第m个人从队 ...
- [Everyday Mathematic]20150212 求 $(\cos x+2)(\sin x+1)$ 的最大值
设 $$\bex t=\tan \frac{x}{2}, \eex$$ 则 $$\bex \cos x=\frac{1-t^2}{1+t^2},\quad \sin x=\frac{2t}{1+t^2 ...
- CMDB反思3
CMDB模型设计1 http://blog.vsharing.com/xqscool/A1274634.html 分类的问题上比较有感悟.在之前编写新版的CMDB模型的时候,曾将刀片机.x86服务器. ...
- eclipse quick diff功能
Eclipse文本编辑器和Java编辑器都提供了quick diff功能.这就使得你可以快速地识别出当前所编辑文件版本和该文件的参考版本之间的不同. 如果编辑器的quick diff功能没有启用,可以 ...
- 运算符重载 C++ 编程思想
class Integer{ int i; public: Integer(int ii) : i(ii) {} const Integer operator+(const Integer& ...