一.实现属性私有就用:#
'use strict' //严格模式
class User {
#site = 'jack'//实现属性私有
constructor(name) {
this.name = name
this.#check(name)//实现方法私有
}
//方法私有同属性私有,这里将方法看成一个属性就OK啦
#check = () => {
if (this.name.length < 4) {
throw new Error('不符合要求')//煲仔们,抛出错误后程序终止,没有返回值。
}
this.name = name
}
//以下是附加内容,通过访问器修改地址:
set host(value) {
if (!/^https?:\/\//i.test(value)) {
throw new Error('地址错误')
}
this._host = value
}
get host() {
return this._host
}
}
let hd = new User('鸣人之子')
hd.host = 'https://www.houdunren.com'
console.log(hd.host);//https://www.bilibili.com
hd.site = 'pink'
console.log(hd.site);//pink
上述代码中存在的疑问:
1.console.log(hd.site); //pink
解释: 由于 #site 是私有属性,hd.site = ‘pink’ 并不会修改私有属性 #site 的值。
这里实际上是给 hd 实例添加了一个新的公共属性 site,并将其值设置为 ‘pink’。
2.hd.#site = ‘pink’ 会报错:私有属性不能直接进行更改(可以通过访问器中修改: 私有属性只能在类的内部访问和修改,外部无法直接访问。)
向User 中添加如下操作:
//属性私有化后,在内部修改:
set site(value) {
this.#site = value
}
get site() {
console.log(this.#site);//pink,证实可以通过访问器修改值
return this.#site//getter方法必须有返回值
}
此时在外部操作:hd.site = 'pink',就是真正更改#site的值。
二.类中属性小小总结:
- 类中直接定义的方法是在原型上。
- 静态方法是在函数上。
- 静态属性是在函数上。
- 直接定义的属性(公共属性)是在实例对象上。
- 私有属性只是私有化,还是在实例对象上。
三.静态属性:
//1.静态属性:
class Name {
static site = 'houdunrne.com'//静态属性,直接加到构造函数上
constructor(name, age) {
this.name = name
this.age = age
}
}
let name = new Name('pink', 18)
console.log(name);
小小点:静态方法不能被实例对象调用。
//2.静态方法:直接给函数添加的方法:
class User {
constructor(name, age) {
this.name = name
this.age = age
}
static creat(...args) {
return this(...args)
}//静态方法直接加到构造函数函数上,User调用。
show() {
console.log('houdunrne.com');
}//show是直接加到原型上
}
let h = new User('向军', 18)
console.log(h);
console.dir(User);
h.show()
煲仔们,今天就到这里啦。
记得放松哦,不要卷死我哦!!!
我会默默注视你的~

被折叠的 条评论
为什么被折叠?



