ES6中Class的一些個人記錄
阿新 • • 發佈:2018-11-28
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