💚写在前面:在解决这个问题之前,我们需要知道对象的属性分为:自身属性和继承属性;可枚举属性;可迭代属性;以symbol为属性值的属性。我们使用不同的AP所I获得的属性不同。
获取对象属性相关的API
hasOwnProperty()
判断是否是自身属性 【返回 布尔值】
Object.keys()
获取自身可枚举属性(for..in
的原理) 【返回 数组】
Object.getOwnPropertyNames()
获取自身可枚举和不可枚举属性 【返回 数组】
for...in
获取自身和继承的可枚举属性( 除去symbol
)( 配合使用hasOwnProperty()
)
for...of
获取自身可迭代属性的值
方法一 -- 封装一个函数调用【for...in
】
function attributeCount(obj){
var count=0;
for(var k in obj){
count++;
}
return count;
}
var testObj={
name1:'value1',
name2:'value2'
}
console.log(attributeCount(testObj)); //结果是:2
方法二 -- 在给对象原型添加方法【for...in
+ hasOwnProperty()
】
function TestObj(name,age){
this.name=name,
this.age=age
}
TestObj.prototype.attributeCount=function(){
var count=0;
for(var k in this){
if(this.hasOwnProperty(k)){ //需要判断,因为扩展了属性
count++;
}
}
return count;
}
var testObj=new TestObj('chailo',12);
console.log(testObj.attributeCount()); //结果是:2
//如果不加 hasOwnProperty() 判断,输出结构为3。因为再继承的原型对象上增加了一个方法attributeCount()
在这里再次啰嗦介绍一下hasOwnProperty()
,这个方法返回一个布尔值,可以用来检测一个对象是否含有特定的自身属性,会忽略掉那些从原型链上继承到的属性。
方法三 -- 返回属性组成的字符串数组【Object.getOwnPropertyNames()
】
var testObj={
name1:'value1',
name2:'value2'
}
console.log(Object.getOwnPropertyNames(testObj).length); //计算数组长度