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


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

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

        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

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

      

  • 相关阅读:
    随机验证码生成
    python之map和filter
    Json学习笔记
    动态规划求区间最值问题RMQ(Range Minimum/Maximum Query)
    积水问题
    5亿个数找中位数
    Linux下进程间通信:命名管道mkfifo
    Trie树总结
    树的公共祖先问题LCA
    类文件结构
  • 原文地址:https://www.cnblogs.com/jf-67/p/7646253.html
Copyright © 2020-2023  润新知