1.class實(shí)現(xiàn)靜態(tài)屬性
es6中實(shí)現(xiàn)了靜態(tài)方法恢准,但是沒(méi)有靜態(tài)屬性
class MyClass {
constructor() {}
static say() {}
}
以上的靜態(tài)方法相當(dāng)于
class MyClass {}
MyClass.say = function() {}
靜態(tài)屬性特點(diǎn):
1.儲(chǔ)存在類中的公共屬性,實(shí)例之間共享一份
2.不用實(shí)例化對(duì)象甫题,直接在類上可訪問(wèn)馁筐。例如MyClass.getName()
因?yàn)樵赾lass中只有this上的屬性,以及class外的變量可被訪問(wèn)坠非。
var age= 0
class MyClass {
constructor(name) {
this.name = name
}
getName() {
return this.name
}
getAge(value) {
return age
}
}
所以靜態(tài)屬性就是
class外的一個(gè)變量敏沉,并且通過(guò)靜態(tài)方法進(jìn)行訪問(wèn)
let name=""
class MyClass {
static getName() {}
static setName() {}
}
2.私有屬性
2.1 WeakMap實(shí)現(xiàn)私有屬性(可被繼承,不可直接被訪問(wèn))
WeakMap知識(shí)點(diǎn)參考:ES6 系列之 WeakMap炎码、ES6 class 靜態(tài)屬性和私有方法
私有屬性的特點(diǎn):不會(huì)暴露在外盟迟,不能通過(guò)this直接訪問(wèn)。子類不能繼承私有屬性
但是用WeakMap實(shí)現(xiàn)的私有屬性可被繼承潦闲。示例如下:
WeakMap以對(duì)象為鍵攒菠,Person實(shí)例化之后this指向?qū)嵗4藭r(shí)以this為鍵可實(shí)現(xiàn)一個(gè)實(shí)例儲(chǔ)存一份變量歉闰。
私有變量name不能通過(guò).name直接獲取到辖众,可以通過(guò)getName()獲取
const privateData = new WeakMap();
class Person {
constructor() {
this.name="name"
privateData.set(this, { age: "age" });
}
getName() {
return privateData.get(this).name;
}
getAge() {
return privateData.get(this).age;
}
}
class Student extends Person{
constructor(){
super()
}
}
let student=new Student()
console.log(student)
console.log(student.getAge())
Student的constructor中調(diào)用了super所以Student的實(shí)例中的this也會(huì)作為key添加到privateData中卓起,value為{age:"age"}。所以WeakMap實(shí)現(xiàn)的私有屬性并沒(méi)有實(shí)現(xiàn)不可繼承的特點(diǎn)赵辕。
2.2 Symbol實(shí)現(xiàn)私有屬性
symbol知識(shí)點(diǎn):es6-symbol
由于Symbol可作為屬性名并且不能被for..in..、Object.key()概龄、Object.getOwnPropertyNames遍歷还惠。所以Symbol可以實(shí)現(xiàn)形式為_(kāi)name的私有屬性
const _counter = Symbol('counter');
const _action = Symbol('action');
class Countdown {
constructor(counter, action) {
this[_counter] = counter;
this[_action] = action;
}
}
與WeakMap實(shí)現(xiàn)的私有屬性相同,由于都在constructor中私杜,所以僅實(shí)現(xiàn)了私有屬性的不暴露蚕键,但是沒(méi)有實(shí)現(xiàn)不可繼承。
3. 私有方法
私有方法與私有屬性的區(qū)別僅在于一個(gè)是方法一個(gè)是屬性衰粹,所以同樣可以用WeakMap與Symbol來(lái)實(shí)現(xiàn)
3.1 WeakMap實(shí)現(xiàn)
由于要使調(diào)用privateFn時(shí)锣光,this指向Person實(shí)例,所以要用箭頭函數(shù)
const privateFns = new WeakMap()
class Person {
constructor() {
this.name="name"
privateFns.set(this,{
privateFn1:()=>{
return this.name
}
})
}
userPrivateFn1(){
console.log(privateFns.get(this).privateFn1())
}
}
new Person().userPrivateFn1()//console.log.("name")
3.2 Symbol實(shí)現(xiàn)
const _privateFn1= Symbol()
class Person {
constructor() {
this.name="name"
this[_privateFn1]=function () {
return this.name
}
}
userPrivateFn1(){
console.log(this[_privateFn1]())
}
}
new Person().userPrivateFn1()//console.log("name")
3.3 模塊中沒(méi)有export的方法
在一個(gè)類一個(gè).js文件的情況下铝耻,僅僅export default這個(gè)類誊爹,再在類外定義一些方法,這些沒(méi)有被export的方法就是私有方法瓢捉。用call()频丘、aply()、bind()的方法可以將這些私有方法的this指向類泡态。
<script type="module">
import Person from "./test.js"
new Person().userPrivateFn()//console.log("name")
</script>
function privateFn() {
console.log(this.name)
}
export default class Person {
constructor() {
this.name="name"
}
userPrivateFn(){
privateFn.call(this)
}
}