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 |
| _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
浙公网安备 33010602011771号