ES6新增的class语法异常帅,然则缭绕这个新的语法糖,在class中怎样完成静态属性、私有属性、私有要领的题目,成为了人人讨论的话题。本文盘算绕过现有的weakmap、symbol的计划,从最简朴的实践中抽掏出满足要求的计划。
静态属性
静态要领异常好完成,就是在一般要领名前面增加static关键字。那末静态属性呢?实在也能够经由过程static关键字来处置惩罚:
class MyClass {
static get name() {
return 'my name'
}
}
如许就能够运用MyClass.name猎取静态属性值了。而且由于没有设置setter,所以这个静态属性值还不能被转变。固然,你也能够把setter加上去。
私有属性
首先要搞邃晓“私有属性”意味着几层意义,不是说情势上满足需求就能够,而是要从代码的机理上完成“私有”结果:
1 class内部差别要领间能够运用,因而this要指向实例化对象(必需)
2 不能被外部接见,因而实例化对象person.name既不能取得值,也不能设定值,应当返回undefined,以至应当在实例化以后,并不知道有name这个属性存在,开辟者以至能够本身再person.name = ‘new name’动态去建立一个非私有属性(必需)
3 不能被继续,因而extends后子类不具备该属性(必需)
4 轻易的挪用体式格局,比方类this._name情势(备选)
上面这些应当是作为私有属性的重要前提,假如连这些都不满足,很难谈得上叫“私有属性”。
完成要领:
var attributions = {}
function get(that, key) {
return attributions[that] && attributions[that][key]
}
function set(that, key, value) {
if(!attributions[that]) attributions[that] = {}
attributions[that][key] = value
}
class MyClass {
set() {
set(this, 'name', 'my name')
}
get() {
let name = get(this, 'name')
console.log(name)
}
}
在类表面有一个辅佐对象attributions,两个辅佐函数set, get。它们将不被实例化对象直接接见,因而是一个相对关闭的空间,外部完整无法接见set, get函数操纵的内容,但关于类的实例化对象罢了,确切有本身对应的属性内容,因而,这类计划,能够替代类内部的私有属性的功用。
私有要领
理论上讲,私有属性和私有要领的区别是,私有要领是函数。因而,实际上,上面私有属性的完成过程当中已完成了私有要领,就是上面的set, get两个辅佐函数,这两个函数协助类完成一些操纵,同时关于每个实例化对象而言都能够设置对应的值,而且也不会被外部猎取。
getter和setter的完成
如今许多类完成了getter和setter,将内部的数据治理和本身的属性离开,转变数据和转变属性是两回事。
var events = {}
var data = {}
class MyClass {
on(event, handler) {
if(!events[event]) events[event] = []
events[event].push(handler)
}
trigger(event, params = []) {
let evts = events[event]
if(Array.isArray(evts)) evts.forEach(callback => {
if(typeof callback === 'function') {
if(Array.isArray(params)) callback.apply(this, params)
else callback.call(this, params)
}
})
}
get(key) {
return data[this] && data[this][key]
}
set(key, value, notify = true) {
if(!data[this]) data[this] = {}
data[this][key] = value
if(notify) {
this.trigger('change:' + key, value)
}
}
call(factory, ...args) {
factory.apply(this, args)
}
}
上面的类中定义了我们最经常使用的on, trigger, get, set, call这几个要领。运用要领:
var a = new MyClass()
a.on('change:name', value => console.log(value))
a.set('name', 'my value')
如许不仅能够有用的治理构造本身的数据,而且还能够经由过程绑定,完成数据变化的监听。
求个兼职,假如您有web开辟方面的须要,能够联络我,生涯不容易,且行且珍爱。
我的个人博客 www.tangshuang.net 这里就不留信息了,请在博客留言,我会联络你