原型与in操作符,hasOwnProperty(),Object.keys

2017-9-13 22:38:01 2,518 views

原型与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循环。

 

0

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”即可将网页分享至朋友圈。