获取对象属性和原型属性


目录

1.Object.keys

 2.getOwnProperyNames

3.hasOwnPropery

4.for..in...

5.for...in循环对象的所有枚举属性,然后再使用hasOwnProperty()方法来忽略继承属性

6.注意 hasOwnProperty 作为属性名

7.IE9下兼容写法遍历可枚举属性


1.Object.keys

    返回该对象上所有可枚举的属性,不包括原型链

      // 创建一个对象的构造方法
      function myObj(name, attr) {
          this.name = name;
          this.attr = attr;
  
          this.sayHi = function () {
              return 'hi everyone!';
          }
      }
 
     // new创建一个对象
     var myTester = new myObj("age", 18)
     // 获取直接在对象上定义(可枚举)的属性和方法
     var arr = Object.keys(myTester);
     console.log('arr', arr); // 输出 arr ["name", "attr", "sayHi"]

 2.getOwnProperyNames

  • 返回可枚举和不可枚举的属性
  • 返回对象上的属性为自身的属性
  • 不会获取原型链上的值
      // 创建一个对象的构造方法
      function myObj(name, attr) {
          this.name = name;
          this.attr = attr;
  
          this.sayHi = function () {
              return 'hi everyone!!!';
          }
      }
 
     // 创建一个对象
     var myTester = new myObj("lh", 1)

     var attr = Object.getOwnPropertyNames(myTester)
     // 返回的数组的所有属性(可枚举或不可枚举)直接找到给定对象。
    console.log("attr",attr ); // 输出 attr ["name", "attr", "sayHi"]

3.hasOwnPropery

返回可枚举的属性

 返回一个布尔值,判断对象是否包含特定的自身(非继承)属性

function foo() {

this.name = 'foo'

this.sayHi = function () {

console.log('Say Hi')

}

}

foo.prototype.sayGoodBy = function () {

console.log('Say Good By')

}

let myPro = new foo()

console.log(myPro.name) // foo

console.log(myPro.hasOwnProperty('name')) // true

console.log(myPro.hasOwnProperty('toString')) // false

console.log(myPro.hasOwnProperty('hasOwnProperty')) // fasle

console.log(myPro.hasOwnProperty('sayHi')) // true

console.log(myPro.hasOwnProperty('sayGoodBy')) // false

console.log('sayGoodBy' in myPro) // true

 

4.for..in...

返回所有可遍历枚举的属性,包括原型上

     // 创建一个对象的构造方法
      function myObj(name, attr) {
          this.name = name;
          this.attr = attr;
  
          this.sayHi = function () {
              return 'hi everyone!!!';
          }
      }
 
     // 创建一个对象
     var myTester = new myObj("lh", 1)
     // 在 Object 原型上增加一个属性
     Object.prototype.type = "people";
 
     // 返回可枚举属性一直找到该对象的原型链
     for (var i in myTester) {
         console.log(i);
     }
     // 输出 name,attr,sayHi,type
 
    

5.for...in循环对象的所有枚举属性,然后再使用hasOwnProperty()方法来忽略继承属性

 for (var i in myTester) {
         if (myTester.hasOwnProperty(i)) {
             console.log(i);
         }
     }
     // 输出 name,attr,sayHi

6.注意 hasOwnProperty 作为属性名

JavaScript 并没有保护 hasOwnProperty 属性名,因此,可能存在于一个包含此属性名的对象,有必要使用一个可扩展的hasOwnProperty方法来获取正确的结果:

var foo = {

hasOwnProperty: function() {

return false;

},

bar: 'Here be dragons'

};

foo.hasOwnProperty('bar'); // 始终返回 false

// 如果担心这种情况,可以直接使用原型链上真正的 hasOwnProperty 方法

// 使用另一个对象的`hasOwnProperty` 并且call

({}).hasOwnProperty.call(foo, 'bar'); // true

// 也可以使用 Object 原型上的 hasOwnProperty 属性

Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

 

7.IE9下兼容写法遍历可枚举属性

 

function enumerable(obj) {

      if(typeof obj !== 'object') return

     var arr = [ ]

     if(Object.keys) {

             arr = Object.keys(obj)

    } else {

             for(var key in obj) {

                      if(Object.prototype.hasOwnProperty.call(obj, key )){

                              arr.push(key )

                      }

         }

   }

  return arr

}

 

 

你可能感兴趣的:(获取对象属性和原型属性)