1. 程式人生 > >ES6遍歷屬性

ES6遍歷屬性

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
}