js_原型内存分析

//以下通过原型创建对象,使用基于原型的创建可以把属性和方法
//设置为对象专有的。不能在通过window来调用了。
function Person(){
 
 Person.prototype.name="Amos";

 }

 Person.prototype.age=23;
 Person.prototype.say=function(){
  alert(this.name+"\t"+this.age);
  }
var p1 = new Person();
p1.say();

//原型是js中非常一个特殊的对象,当一个函数创建之会随之产生一个原型对象。
//当通过这个函数的构造函数创建了一个具体的对象之后。在这个具体的对
//象中,就会有一个属性指向原型

person

prototype 指向person  prototype
   

person prototype

constructor 指向person  
   

以上是第一种状态:function Person(){}。这个时候产生。 Person函数中有一个prototype的属性指向person的原型对象。在原型对象中有一个constructor的属性指向Person函数。所有可以通过new Person来创建对象。

第二中状态: 添加属性和方法

person

prototype 指向person  prototype
   

person prototype

constructor 指向person  
 name  Amos
age 22
say function

 

 

 第三种状态。 创建对象
var p1 = new Person();
 
_prop_ 也指向对象的原型
   

说明:当Person创建了对象之后,会在对象中有一个_prop_属性。这个属性是不可以访问的(指向原型)。当使用对象调用原型的时候,首先会在对象的内部找是否有这个属性,如果没有会通过_prop_去原型中找属性。所以当调用p1.say()在自己的空间中不存在这个方法,就会去原型中找。

第三种状态中,创建一个一个对象会有_prop_的属性。指向对象的原型。而且这个属性是隐藏的。我们要想知道对象中是否有_prop_指向Person的原型

就可以调用alert(Person.prototype.isprototypeof(p1));

第四中状态

var p2 = new Person();

p2.name="ada";

_prop_  
name ada

当创建一个新的p2的时候,依旧会有一个_prop_指向对象原型。此时通过p2.name设置了属性后,会在对象自己的内存空间存储name的值,当调用say()的时候在

寻找name的值,就会在自己的空间找,就不会到对象的原型中找。

 

额外的一些方法:

 1:检测某个构造器是否指向我们的Person

 p1.constructor==Person;

2:检测某个属性是否是自己的属性

alert(p1.hasOwnProperty("name"));//false

alert(p2.hasOwnProperty("name"));//true -p2在自己的空间设置name属性

3:删除自己空间的属性

delete p2.name;

alert(p2.hasOwnPropetry("name")) //false,已经删了

4:检测某个对象在原型中或者自己的空间是否有该属性 通过 in 检测

alert("name" in p1 ); //true

alert("name" in p2 ); //true

alert("address" in p1 ); //false

5:可以通过如下方法检测某个属性是否在原型中存在

function hasPro(obj1,prop){

return ((!obj.hasOwnProperty(prop))  &&  (prop in obj) );

}

alert(hasPro(p1,"name")); true

alert(hasPro(p2,"name")); false

 

 

 

 
 
 

 

posted on 2013-07-01 17:18  菜鸟半只  阅读(411)  评论(0)    收藏  举报

导航