js对象属性的获取

  1. 获取对象的可枚举属性
  • for in: 遍历的是对象本身及其原型链上的可枚举属性

ES5写法:
对于Object对象,即Object构造器构造出来的对象来说:

  var obj = {name: 'zyp', age: 18}
  Object.defineProperty(obj, 'like', {value: 'reading', enumerable: false})
  let objArr1 = [], objArr2 = []
  for(let i in obj) {
           objArr1.push(i)
   }
  console.log('objArr1',objArr1)

  Object.prototype.proper1 = function() { console.log(1111)}
  Object.prototype.proper2 = 2
  for(let i in obj) {
           objArr2.push(i)
   }
  console.log('objArr2',objArr2)

输出结果为
objArr1 [“name”, “age”]
objArr2 [“name”, “age”, “proper1”, “proper2”]

对于自己自己定义的构造器构造出来的对象而言:

function Foo(name, age) {
	this.name = name
	this.age = age
}
var foo = new Foo('zyp', 18)
Object.defineProperty(foo, 'like', {
	value: 'sleep',
	enumerable: false
})
let fooArr1 = [], fooArr2 = [];
for(let i in foo) {
	fooArr1.push(i)
}
console.log('fooArr1',fooArr1 )

Foo.prototype.proper1 =  function() {
	console.log(1111)
}
Foo.prototype.proper2 = 2
for(let i in foo) {
	fooArr2.push(i)
}
console.log('fooArr2', fooArr2)

输出结果为
fooArr1 [“name”, “age”]
fooArr2 [“name”, “age”, “proper1”, “proper2”]

ES6写法:

       //定义父类A
        class A {
            constructor(name, age) {
                this.name = name;
                this.age = age;
            }
             show() {
                console.log(22222)
            }
        } 
        let newA = new A('zyp', 18)  
        Object.defineProperty(newA, 'haha', {value: 'haha', enumerable: false})
        let newAarr = [];
        for(let i in newA) {
            newAarr.push(i)
        }
         console.log('newAarr',newAarr) 

输出结果是newAarr [“name”, “age”] ,因为’haha’是不可枚举属性,show函数默认定义在原型链上,但是这种用class定义的行为属性是不可枚举的(我试了用构造函数方法在prototype上定义行为属性是可以枚举的,这里搞不懂~~)

//定义子类
class AA extends A {
  constructor(like) {
        super('zyp1', 188);
        this.like = like;
    }
    showAA() {

    }
}

let newAA = new AA('reading')
Object.defineProperty(newAA, 'haha2', {value: 'haha2', enumerable: false})
let newAAarr = []
for(let i in newAA) {
	newAAarr.push(i)
}
console.log('newAAarr', newAAarr)

输出的结果为 newAAarr [“name”, “age”, “like”]

因此,for in 可以迭代出对象及其圆形两上的可枚举属性,而hasOwnProperty可以判断属性是否在当前对象上,因此可用来过滤for in 从原型链上循环出来的属性,得到对象本身的可枚举属性。

  • hasOwnProperty可以用来遍历对象本身的可枚举和不可枚举属性

以ES5写法中的obj为例:

var objArr3 = []
for(let i in obj) {
	if(obj.hasOwnProperty(i)) {
		objArr3.push(i)
	}
}
console.log('objArr3', objArr3) //objArr3 ["name", "age"]
  • 用Object.keys()来获取对象本身的可枚举属性名
var objArr4 = Object.keys(obj)
console.log('objArr3', objArr3) //objArr3 ["name", "age"]

总结:可以用for in + hasOwnproperty 或者Object.keys()来获取对象的可枚举属性。

  1. 获取对象本身的属性(可枚举和不可枚举,不包括Symbol类型的属性)

以数组为例

var arr = ['name', 'age']
console.log(object.getOwnPropertyNames(arr)) //输出["0", "1", "length"]

总结:可以用Object.getOwnPropertyNames()来获取对象本身的可枚举和不可枚举属性(不包括Symbol)。

备注:
这里要补充的是可以使用Object.getOwnPropertyDescriptor(obj, prop)来获取对象本身属性(包括可枚举和不可枚举属性)的属性描述符。

   var obj = {_name: 'zyp', _age: 18}
   Object.defineProperty(obj, 'name', {
		get() {
			return this._name + '1'
		}
	})
	var _nameDescriptor = Object.getOwnPropertyDescriptor(obj, '_name')
	var nameDescriptor = Object.getOwnPropertyDescriptor(obj, 'name')

得到的结果如下图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值