1.在某个对象是否拥有某个属性,判断的方法有不少,经常使用的方法就是object.hasOwnProperty('×××'),这个方法是不包括对象原型链上的方法的,举个例子:javascript
var obj = { name:'fei' } console.log(obj.hasOwnProperty('name'))//true console.log(obj.hasOwnProperty('toString'))//false
在这个例子中,obj对象存在的name属性的时候,调用这个方法才是返回true,咱们知道其实每一个对象实例的原型链上存在toString方法,在这里打印false,说明这个方法只是代表实例对象的属性,不包括原型链上的属性。java
2.下面咱们再来看看in的使用,例子以下:数组
var obj = { name:'fei' } console.log('toString' in obj)//true
咱们能够看到,其实在这个例子中,我只是给了对象一个属性name,并无其余的属性,而后我执行'tiString' in obj,能够看出控制动态打印出来的是true,缘由就是对象的原型链上存在toString方法,因此in操做无论是否是原型链上,只要存在这个属性,返回的就是true。浏览器
3.接着咱们再看for in。在使用for in 循环的时候,其实返回的是能经过对象访问的,可枚举的,包括实例中的,也包括原型中的,例子以下spa
var obj = { name:'fei', age:20, friend:["fei","jun","zhu"] } for( var i in obj){ console.log(i)//会打印三次,name,age,friend }
为何上面没有打印原型中的属性呢,由于原型中的属性都默认设置了不可枚举(enumerated);咱们将例子改为下面这样:prototype
var obj = { name:'fei', age:20, friend:["fei","jun","zhu"] } Object.defineProperty(obj, 'like', {//使用Object.defineProperty()方法能够设置你设置属性的特性 enumerable:false,//设置不可枚举 value:'basketball'//值为basketball }) console.log(obj)//Object {name: "fei", age: 20, friend: Array[3], like: "basketball"} for(var i in obj){ console.log(i)//依旧打印三个name,age,friend }
从这个例子中能够看出,在给属性设置为不可枚举的时候,是不会出如今for in循环中的,这也形成IE低版本出现bug,就是不可枚举的属性不会出如今for in中,若是你重新定义了一个属性和原型的属性相同,那么这个属性也不会出如今for in中,如今的浏览器不会出现,例子以下:code
var obj = { toString:function(){ return "666" } } for(var i in obj){ if(i=="toString"){ console.log('我出现了') //在低版本的IE中不显示 } }
4.要取得全部可枚举的对象,可使用ECMAscript5的方法Object.keys(),接受一个对象为参数,返回全部可枚举的属性的字符串数组:对象
function People(){ } People.prototype.say = function(){ console.log('say') } People.prototype.name = "feifei"; var people = new People() people.age = 12; console.log(Object.keys(people))//['age']
这个方法并不会包含原型链中的属性,只是实例中的可枚举的属性。blog
5.获取实例中全部属性,不管是否可枚举,利用Object.getOwnPropertyNames(),以对象为参数,返回熟悉的数组。例子:ip
function People(){ } People.prototype.say = function(){ console.log('say') } People.prototype.name = "feifei"; var people = new People() people.age = 12; Object.defineProperty(people, 'like', {//使用Object.defineProperty()方法能够设置你设置属性的特性 enumerable:false,//设置不可枚举 value:'basketball'//值为basketball }) console.log(people)//People {age: 12, like: "basketball"} console.log(Object.getOwnPropertyNames(people))//["age", "like"]
这个方法仅仅是返回实例中全部的属性,不管是否是可枚举的,不包括原型里面的属性。