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"]
這個方法僅僅是返回實例中全部的屬性,不管是否是可枚舉的,不包括原型裏面的屬性。