zoukankan      html  css  js  c++  java
  • 探究原型中某些类型是否可共享问题

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

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

        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

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

      

  • 相关阅读:
    Java后端面试题大汇总,冲刺金三银四
    面试官:小伙子,Mybatis的本质和原理说一下
    面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
    便捷搭建 Zookeeper 服务器的方法,好用,收藏~
    10 个冷门但又非常实用的 Docker 使用技巧
    mitmproxy 抓包工具(1)
    基于alpine创建Scrapy镜像
    强大的输入框-应用快速启动uTools
    Interceptor、Filter、Servlet的区别
    利用三层判断sql数据库中编码是否已经存在(个人拙作,不喜勿喷)
  • 原文地址:https://www.cnblogs.com/jf-67/p/7646253.html
Copyright © 2011-2022 走看看