ES6遍歷屬性
阿新 • • 發佈:2019-02-09
Es6遍歷物件屬性方法有如下幾個:Object.keys(obj) ,Object.getOwnPropertyNames()等等。
補充個概念,可列舉,不可列舉型別。
在JavaScript中,物件的屬性分為可列舉和不可列舉之分,它們是由屬性的enumerable值決定的。可列舉性決定了這個屬效能否被for…in查詢遍歷到。
1. js中基本包裝型別的原型屬性是不可列舉的,如Object, Array, Number等,如果你寫出這樣的程式碼遍歷其中的屬性:
var num = new Number();
for(var pro in num) {
console.log("num." + pro + " = " + num[pro]);
}
它的輸出結果會是空。這是因為Number中內建的屬性是不可列舉的,所以不能被for…in訪問到。
Object物件的propertyIsEnumerable()方法可以判斷此物件是否包含某個屬性,並且這個屬性是否可列舉。
需要注意的是:如果判斷的屬性存在於Object物件的原型內,不管它是否可列舉都會返回false。
定義一個不可列舉屬性
var kxy = new Person();
Object.defineProperty(kxy, "sex", {
value: "female",
enumerable: false
});
'use strict'
class A{
constructor(){
this.name='ggb'
}
getName(){
}
}
class B extends A{
constructor(){
super();
this.age=28;
}
[Symbol('fullname')](){
}
getAge(){
}
}
B.prototype.getClass=function(){
}
var b =new B();
//只能訪問自身可列舉屬性,得不到原型鏈上的屬性
console.log(Object.keys(b));//[ 'name', 'age' ]
//只能訪問自身非可列舉屬性與可列舉屬性,得不到原型鏈上的屬性
console.log(Object.getOwnPropertyNames(b))//[ 'name', 'age' ]
//啥都能訪問
console.log(Object.getOwnPropertySymbols(b))//[]
//如下什麼也得不到
console.log(Object.keys(b.__proto__));//[ 'getClass' ]
//如下,可以得到不可列舉屬性
console.log(Object.getOwnPropertyNames(b.__proto__))//[ 'constructor', 'getAge', 'getClass' ]
//如下可以得到 symbole型別
console.log(Object.getOwnPropertySymbols(b.__proto__))//[ Symbol(fullname) ]
for(let k in b ){
console.log(k) //name ,age,getClass
}