使用构造器的弊端: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 原型的内存分析的更多相关文章

  1. 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 ...

  2. JS内存泄漏 和Chrome 内存分析工具简介(摘)

    原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱   原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - AR ...

  3. js原型

    1.js基本类型和对象类型 js的简单类型包括数字(其中NaN为数字类型).字符串(类似'A'为字符,js没字符类型).布尔值.null值和undefined值.其他所有的值都是对象.数字.字符串和布 ...

  4. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

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

    阅读目录 对象大小(Object sizes) 对象的占用总内存树 支配对象(Dominators) V8介绍 Chrome 任务管理器 通过DevTools Timeline来定位内存问题 内存回收 ...

  6. [转载]JavaScript内存分析

    https://github.com/CN-Chrome-DevTools/CN-Chrome-DevTools/blob/master/md/Performance-Profiling/javasc ...

  7. js原型解析

    我们都知道javascript因为具有了继承以及变量等等一系列的特性之后才被人们认为具有一门编程语言的资格,在后续的不断发展中,js在原生的基础上扩展了基于jquery等等的库,甚至衍生了像node. ...

  8. 深入理解JS原型链与继承

    我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...

  9. js 原型链和继承(转)

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...

随机推荐

  1. javamail模拟邮箱功能--邮件删除-中级实战篇【邮件标记方法】(javamail API电子邮件实例)

    前言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 本章可能是讲解javamail的最后一 ...

  2. Android 高仿UC浏览器监控剪切板弹出悬浮窗功能

    UC浏览器应该是android手机里 最流行的浏览器之一了,他们有一个功能 相信大家都体验过,就是如果你复制了什么文字,(在其他app中 复制也有这个效果!,所以能猜到肯定是监控了剪切板),就会弹出一 ...

  3. Ruby on rail 开发准备

    下载安装Instant Rails ,该软件包中包含了Ruby,Rails,Apache(HTTP服务器软件),MySql,并且配置均可自动完成.完成安装后就可以拥有一个完整的Rails开发环境.下载 ...

  4. 一种Javascript解释ajax返回的json的好方法

    通常ajax请求返回的格式为json或者xml,如果返回的是json,则可以通过转换成javascript对象进行操作,如下: 1.ajax请求的controller实现 @RequestMappin ...

  5. ArcEngine9.3报错Create output feature class failed

    ArcEngine9.3执行IFeatureDataConverter.ConvertFeatureClass Method出错如下错误信息: Create output feature class ...

  6. struts2 action 返回图片流

    数据库为mssql zp字段为image类型 java代码 OutputStream out = null; try { String contenttype = "image/jpeg&q ...

  7. JS判断手机访问页面,根据手机访问或者PC访问跳转

    当用户访问你网站时,如果是PC端访问,则不作处理,如果是手机或者平板访问,就跳转到自己定义的手机页面去,这个在做webapp的时候经常用到,把代码分享给大家,希望对大家有所帮助. 首先,你要在页面中引 ...

  8. Oracle自定义数据类型 2 (调用对象方法)

    调用对象方法 调用对象方法基于类型创建表后,就可以在查询中调用对象方法 A. 创建基于对象的表语法: create   table   <表名>   of   <对象类型>意义 ...

  9. Delphi 关闭MDI子窗口

    需要在子窗口的onClose事件中吧Action = caFree; 就可以了. procedure Tfrm_aa.FormClose(Sender: TObject; var Action: TC ...

  10. The remote SSH server rejected X11 forwarding request

    两台相同的虚拟机,一台没有错误,一个经常出现警告,内容如下所示: The remote SSH server rejected X11 forwarding request 找了很多方法,最后发现是安 ...