接着上一篇的问题,我们引入了javascript原型这个概念。首先先看一下这个例子:
function Cat(){};
Cat.prototype.name="猫";
Cat.prototype.age=2;
Cat.prototype.sex="男";
Cat.prototype.eat=function(){
alert("我的名字叫"+this.name+"我"+this.age+"岁"+this.sex+"我爱吃鱼");
}
var whitecat=new Cat();
whitecat.say();
这样引入原型之后我们可以看到现在的say已经成了Cat对象独有的方法,现在window已经无法访问。这里着重介绍下原型的基本原理:当我们在构建函数的时候Cat的时候就会有一个Cat函数的原型出现,Cat对象直指它的Cat prototype,而Cat prototype中有constructor属性又直指Cat对象本身,这样在写Cat属性的时候相当于把属性全部存入了它的原型当中,而当用构造函数创建出来一个对象之后,那个对象里面又有一个_prop_属性指向原型,当在调用这个对象的某个属性的时候如果这个对象中存入的有这个属性及属性值就会就近原则调用自己本身的属性,如果没有的话就会往原型上面找这个属性然后调用,如果原型上有某个属性及属性值而你在对象中也定义了这个属性及属性值的话也会选择这个对象自身的这个属性来进行调用。然后也可以通过上面的判断方法来判断whitecat是不是指向Cat的原型。。。同样的,用构造函数创造出来的其他对象也跟例子中的那个对象的用法一样。特别要注意的是当我们自己定义原型中已经存在的属性和属性值时,原型中的属性和属性值只是被覆盖了而不是不存在了,这只是一个查找顺序的问题。
接下来要介绍的就是几种常见的检测和删除方式:
1.可以通过以下的方式检测whitecat是不是指向Cat的原型
alert(Cat.prototype.isPrototypeOf(whitecat));
2.可以通过以下的方式检测whitecat的构造器是不是指向Cat
alert(whitecat.constructor==Cat);
3.可以通过以下的方式检测whitecat是不是有自己的某个属性
alert(whitecat.hasOwnProperty("属性名"));
4.可以通过以下的方式来删除我们赋予这个对象的某个属性,但是原型中的属性时不能被删除的。
delete whitecat.属性名;
5.如何检测该属性在原型中而不在自己的属性中呢?
function fun(a,obj){
if(!obj.hasOwnProperty(a)){
if(a in obj){
return true;
}
}
return false;
}
这样就可以通过调用这个函数所得到的返回值来检测该对象的某个属性是在原型中还是在自身。