• 对象是否拥有某个属性,in和for in以及object.hasOwnProperty('×××')的异同,以及Object.defineProperty(),Object.keys(),Object.getOwnPropertyNames()的用法


      1.在某个对象是否拥有某个属性,判断的方法有很多,常用的方法就是object.hasOwnProperty('×××'),这个方法是不包括对象原型链上的方法的,举个例子:

    var obj = {
        name:'fei'
    }
        console.log(obj.hasOwnProperty('name'))//true
        console.log(obj.hasOwnProperty('toString'))//false

    在这个例子中,obj对象存在的name属性的时候,调用这个方法才是返回true,我们知道其实每个对象实例的原型链上存在toString方法,在这里打印false,说明这个方法只是表明实例对象的属性,不包括原型链上的属性。

      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 循环的时候,其实返回的是能通过对象访问的,可枚举的,包括实例中的,也包括原型中的,例子如下

    var obj = {
          name:'fei',
          age:20,
          friend:["fei","jun","zhu"]
    }
    for( var i in obj){
          console.log(i)//会打印三次,name,age,friend
    }
    

    为什么上面没有打印原型中的属性呢,因为原型中的属性都默认设置了不可枚举(enumerated);我们将例子改成下面这样:

    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中,现在的浏览器不会出现,例子如下:

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

    这个方法并不会包含原型链中的属性,只是实例中的可枚举的属性。

    5.获取实例中所有属性,无论是否可枚举,利用Object.getOwnPropertyNames(),以对象为参数,返回熟悉的数组。例子:

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

    这个方法仅仅是返回实例中所有的属性,无论是不是可枚举的,不包括原型里面的属性。

      

  • 相关阅读:
    Linux基础操作
    MySQL基础常用指令
    String什么时候创建一个新对象?
    HashMap源码浅析
    LinkList源码浅析
    ArrayList源码浅析
    如何解决syntax error near unexpected token `fi'
    如何解决The request sent by the client was syntactically incorrect.
    Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> ajaxTest in servlet mapping
    CLUSTER cluster is down,redis报错
  • 原文地址:https://www.cnblogs.com/zhenfei-jiang/p/7028686.html
Copyright © 2020-2023  润新知