探究原型中某些类型是否可共享问题

  今天在群里无意中看到这样一个问题,就是原型中某些类型是否可共享问题。

  还是直接上代码说事儿吧。

    function A(){};
    A.prototype = {
        abc:{
            abc:456
        },
        d:"tom",
        e:789,
        set:function(){
            this.abc.abc = 456789;
            this.d = "john";
            this.e++
        },
        get:function(){
            console.log(this.abc.abc);
            console.log(this.d);
            console.log(this.e)
        }
    };

  大意是这样的,创建了一个构造函数A,然后给A添加了一些原型属性和方法。首先是给A添加了一个原型属性abc,其值为一个对象{abc:456},对象的属性为abc,属性值为456,然后又添加了两个属性d和e,d的值为字符串"tom",e的值为数值型789,紧接着是给A添加了两个方法set方法和get方法,一个方法是重新设置A的原型属性abc、d、e的值,然后另个一方法则是获取这些值。

  现在实例化函数A。

var a = new A();
var b = new A();

  因此现在a、b分别继承了函数A的原型属性和方法。

  首先我要做的是获取函数A的原型属性的属性值。因此我的做法是先调用get方法。

  (1)、调用a.get()  方法。不出意外的话,得到的结果应该是456  tom  789,经测试后结果确实是这样。

  (2)紧接着进行第2步,执行a.set() 方法,然后再次执行a.get()方法。那么结果应该为456789  john  790经测试,结果也是对的。

  (3)以上都没什么问题,现在进行第3步,执行b.get()方法,那么问题来了。

  按照原型的属性继承,此刻得到的结果应该是456789  john  790 才对啊,很遗憾,此刻得到的结果是456789  tom  789,可以看出,只有属性abc继承过来了,而属性d、e并没有继承。

  这是怎么回事了,为什么属性abc继承过来了,而d、e则没有继承过来呢?紧接着,我把第3步换了一下,我先执行b.set()方法,然后再执行b.get()方法,此刻得到的结果才是我们原本想得到的结果。456789  tom  789

  这是为什么呢?查过许多资料与多次测试后,得出的结论就是:引用类型被所有实例共享,而字符串型、数值型则不被共享

  

posted @ 2017-10-10 16:13  江峰★  阅读(202)  评论(0编辑  收藏  举报