美文网首页
遍历对象实例的属性和方法

遍历对象实例的属性和方法

作者: 黄金林 | 来源:发表于2018-08-05 00:01 被阅读0次

    前言

    遍历对象实例的方法有3种,1.通过for in,2通过Object.keys方法,3.通过Object,getOwnPropertyNames
    这三种方式默认不可枚举的所有属性和方法,包括:hasOwnProperty()、propertyIsEnumerable()、toLocaleString()、toString()和valueOf()。ECMAScript5也将constructor和prototype属性的[[Enumerable]]特性设置为false,但并不是所有浏览器都照此实现。

    class Person {
      constructor(){
        this.name = ""
        this.age = 0
      }
      sayName(){
        console.log('sayName')
      }
    }
    var o1 = new Person()
    /*
    3种写法,都输出name,age没有输出sayName,constructor
    */
    //第1种方式
    for(var prop in o1){
      console.log(prop)
    }
    //第2种方式
    console.log(Object.keys(o1))
    //第3种方式
    console.log(Object.getOwnPropertyNames(o1))
    

    示例
    我们希望能输出对象实例的所有属性和原型的方法需要依靠Object.getOwnPropertyNames

    function getOwnPropertyNames(obj){
      return [...Object.getOwnPropertyNames(Object.getPrototypeOf(obj)),
    ...Object.getOwnPropertyNames(obj)];
    }
    console.log(getOwnPropertyNames(o1))
    

    示例
    另外
    1.Object.hasOwnProperty只能用作判断实例是否包含属性和方法,而无法判断原型是否包含,
    2.in操作可以判断实例和元素是否包含属性和方法

    var o1 = new Person()
    console.log(o1.hasOwnProperty('name')) // true
    console.log(o1.hasOwnProperty('sayName')) // false
    
    console.log('name' in o1) //true
    console.log('sayName' in o1) //true
    

    从而可以定义一个判断原型是否包含属性和方法的方法

    function hasPrototypeProperty(obj, name){
      return !obj.hasOwnProperty(name) && name in obj;
    }
    

    示例

    相关文章

      网友评论

          本文标题:遍历对象实例的属性和方法

          本文链接:https://www.haomeiwen.com/subject/teevvftx.html