ES6中class私有属性和私有要领

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 这里就不留信息了,请在博客留言,我会联络你

    原文作者:唐霜
    原文地址: https://segmentfault.com/a/1190000008606016
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞