1. 程式人生 > >ES6中Class的一些個人記錄

ES6中Class的一些個人記錄

1.Class的內部所有定義的方法,都是不可列舉的。

const funName = 'fun';
//類Demo		
class Demo{
	constructor(arg) {
	    
	}
	say(){
		
	}
	speak(){
		
	}
	[funName](){
		
	}
}

console.log( Object.keys(Demo.prototype) )	//[]
console.log(Object.getOwnPropertyNames(Demo.prototype))//["constructor", "say", "speak", "fun"]


//建構函式F
function F(){} F.prototype.say = function(){}; F.prototype.speak = function(){} F.prototype[funName] = function(){} console.log( Object.keys(F.prototype) ) //["say", "speak", "fun"] console.log( Object.getOwnPropertyNames(Demo.prototype) )//["constructor", "say", "speak", "fun"]

其中,參考【Javascript屬性列舉的5個方法比較


Object.getOwnPropertyNames()方法返回一個數組,包含所有例項屬性,無論它是否可列舉(但不包括Symbol值作為名稱的屬性)。
Object.keys()可以取得物件上所有可列舉的例項屬性,返回值是包含所有可列舉屬性的字串陣列。
利用這兩種方法的差異,可以檢測物件的例項屬性是否可列舉

2.檢測物件的屬性是否可列舉:

const isEnumerable = (prop, obj) => 
(Object.getOwnPropertyNames(obj).indexOf(prop)) > -1 && (Object.keys(obj)
.indexOf(prop) > -1);

isEnumerable是Boolean型別,返回true表示屬性可列舉,false為不可列舉

isEnumerable('say', Demo.prototype) 		//false
isEnumerable('speak', Demo.prototype) 		//false
isEnumerable('constructor', Demo.prototype) 		//false

isEnumerable('say', F.prototype) 		//true
isEnumerable('speak', F.prototype) 		//true
isEnumerable('constructor', F.prototype) 		//false