aralejs / class

Class Utility

Home Page:aralejs.org/class

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Statics 和 StaticsWhiteList 的问题

bubkoo opened this issue · comments

commented

我在使用如下这段代码时,发现设置 StaticsWhiteList 并不像预想的那样,简单地说就是 StaticsWhiteList 并没有起作用,请看下面是示例:

        var Pig = Class.create({
            initialize: function (name) {
                this.name = name;
            },
            talk: function () {
                alert('我是' + this.name);
            },
            Statics: {
                AGE: 3,
                FROM: 'China'
            },
            StaticsWhiteList: 'FROM'
        });

        var pig = new Pig('猪');
        console.log('Pig.AGE = '+Pig.AGE);
        console.log('Pig.FROM = '+Pig.FROM);

        var RedPig = Pig.extend({
            initialize: function (name) {
                RedPig.superclass.initialize.call(this, name);
            },
            color: '红色'
        });

        var redPig = new RedPig('猪');
        console.log('RedPig.AGE = '+RedPig.AGE);
        console.log('RedPig.FROM = '+RedPig.FROM);

执行输出结果:

Pig.AGE = 3
Pig.FROM = China 

RedPig.AGE = 3
RedPig.FROM = China 

结果是拷贝了父类中所有的静态属性。

问题在于在继承的时候,源代码中并没有将 'StaticsWhiteList' 保存到父类的静态属性中,我在 'Mutators' 中加对 'StaticsWhiteList' 处理的代码:

        'StaticsWhiteList': function (val) {
            this['StaticsWhiteList'] = val;
        }

修改之后,结果和预期的一样。。。

还有一个问题想讨论:
一旦没有设置 StaticsWhiteList,父类中的所有静态属性或方法将被拷贝到子类中,这个符合我们的通常思维,但是设置 StaticsWhiteList 之后就只会拷贝 StaticsWhiteList 所指定的属性,感觉这样有点不合理;个人认为可以将 StaticsWhiteList 修改为 StaticsBlackList,这样 StaticsBlackList 之外的静态属性或方法都拷贝到子类中,StaticsBlackList 所指定的属性就相当于成为了封闭属性,和封闭类有异曲同工之处。

如果理解有误请拍砖。

+1

2015年了,可以用 es6 的 class 了,谁还用这个。。