由浅到深了解JavaScript类

2019-06-03 20:10:05于丽

        比如给WuYouUser类定义一个注册用户的数量Count:

        WuYouUser.prototype.Count = 0;

        那么如何读取它呢?有两种方法:

        1. 直接用 WuYouUser.prototype.Count
        2. 使用Wo.Count

        这两者没有区别,都是得到0

        虽然读取方法可以有两种,但在改变它的时候却得特别小心了,请看下边代码

        
        var Biyuan = new WuYouUser();
        WuYouUser.prototype.Count++;
        document.write(Wo.Count);
        document.write(Biyuan.Count);


你会发现两者的Count属性都是1,也就是说WuYouUser.prototype.Count改变了会影响到各个实例的相应属性,其实原理就是Wo、Biyuan的Count属性与WuYouUser.prototype.Count根本就是同一个!

        现在来看另外一段代码:

        
        var Biyuan = new WuYouUser();

        Biyuan.Count++; //特别注意一下这里,这是直接改变Biyuan的Count属性
        document.write(Biyuan.Count); // 输出 1
        document.write(WuYouUser.prototype.Count); //输出 0
        document.write(Wo.Count); //同样输出0,为什么?


可以看到如果直接修改实例的静态属性值,那么会出现其它实例甚至类的静态属性与它不同步了?这是因为直接修改的时候,该实例会生成一个属于该实例的属性Count,这个时候Biyuan.Count不再与WuYouUser.prototype.Count是同一个了,也不与Wo.Count是同一个,这个Count属性是属于Biyuan自己所有的,以后改变了它也只是影响它自己而已。

        因此如果不是特别的需要,建议不管在读取还是赋值的时候,都统一使用WuYouUser.prototype.Count这样的方式,以做到万无一失!


静态方法
与静态属性相似,它也有个另称:公共方法,同样属于类本身的。

        静态方法的定义方式是:

        类名.方法名 = function(参数1,参数2...参数n)