對象是否擁有某個屬性,in和for in以及object.hasOwnProperty('×××')的異同,以及Object.defineProperty(),Object.keys(),Object

  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"]

這個方法僅僅是返回實例中全部的屬性,不管是否是可枚舉的,不包括原型裏面的屬性。

相關文章
相關標籤/搜索