原型与in操作符
有2种方式使用in操作符:单独 使用和在for-in循环中使用.在单独使用时,in操作符会通过对象能够访问给定属性时返回true,无论该属性是在原型中还是实例中。
function Person(){ } Person.prototype.name="mike"; Person.prototype.sayName=function(){ alert(this.name); }; var person=new Person(); alert(person.hasOwnProperty("name"));//存在于原型中所以为false alert("name" in Person);//true person.name="greg"; alert(person.name);//实例中的属性覆盖了原型中的属性greg alert(person.hasOwnProperty("name"));//实例中的属性覆盖了原型中的属性,所以为true alert("name" in person);//true delete person.name; alert(person.name);//因为这删除了实例中属性,所以显示为原型中的属性mike alert(person.hasOwnProperty("name"));//false alert("name" in person);//true
hasOwnProperty()方法
同时使用hasOwnProperty()方法和In操作符,就可以确定该属性到底是存在于对象中还是存在于原型中
function Person(){} Person.prototype.name="mike"; var person=new Person(); function hasPrototypeProperty(obj,name){ return (!obj.hasOwnProperty(name))&&(name in obj); } alert(hasPrototypeProperty(person,"name"));//true;存在于原型中 person.name="greg"; alert(hasPrototypeProperty(person,"name"));//false;存在于实例中
2 在使用for-in 循环时,返回的是所有能通过对象访问的,可枚举的属性,其中即包括存在于实例中的属性,也包括存在于原型中的属性。
IE8及更早版本存在Bug,屏蔽不可枚举属性的实例属性不会出现在for-in循环中.
var o={ toString:function(){ return "My Object"; } }; for(var prop in o){ if(prop=="toString"){ alert("find");//在ie中不会显示 } }
Object.keys()方法:
要去的对象上素有可枚举的实例属性,可以使用es5的Object.keys()方法这个方法接收一个对象作为参数,返回包含所有可枚举属性的字符串数组。
function Person(){} Person.prototype.name="mike"; Person.prototype.age=29; Person.prototype.job="engineer"; Person.prototype.sayName=function(){ alert(this.name); }; var person=new Person(); person.name="greg"; var arr=Object.keys(Person.prototype); alert(arr);//name,age,job,sayName var arry=Object.keys(person); alert(arry);//name 要得到所有实例属性无论是否可枚举,则可以用 Object.getOwnPropertyNames()方法 var keys=Object.getOwnPropertyNames(person.prototype); alert(keys);//constructor,name,age,job,sayName,//constructor是不可枚举的 Object.keys()和Object.getOwnPropertyNames()方法都有可以用来替代for-in循环。