【问题标题】:Javascript prototype inheritance with objects in objects [duplicate]Javascript原型继承与对象中的对象[重复]
【发布时间】:2016-12-04 12:32:27
【问题描述】:

我很难理解这一点,甚至在互联网上摸索。这是我在 javscript 中的 sn-p:

    TEST=function(){};
    TEST.prototype={
        b:{
            b1:"",
            b2:{}
        }
    };

    //Instance 1
    var first=new TEST();
    first.b.b1="TEXT";

    //Instance 2
    var second=new TEST();

    console.log("Result",second.b.b1);

控制台日志会输出“TEXT”,我想要“”。所以我想知道为什么我得到这个结果,为什么在创建一个新实例然后设置值时它会改变“TEST”原型(这是我的主要问题)?

我得到了 Bergi 和 Mykola 的帮助(谢谢),还有一个副本。但是我仍然认为我因这种行为而丢失了资源,并且想知道为什么要以这种方式构建它?处理实例时无需更新原型。

【问题讨论】:

    标签: javascript object inheritance prototype


    【解决方案1】:

    为所有实例添加原型继承中的方法和属性。因此,当您更改原型对象中的值时,您会为所有实例更改此值。

    为了解决这个问题。您需要在构造函数中设置值,因此它会为每个实例初始化不同的值。

    这将输出你想要的。

    TEST=function(){
      this.b ={
            b1:"",
            b2:{}
        }
    };
    TEST.prototype.forAll = "im global";
    //Instance 1
    var first=new TEST();
    first.b.b1="TEXT";
    
    //Instance 2
    var second=new TEST();
    
    console.log("Second",second.b.b1, second.forAll);
    console.log("First",first.b.b1, first.forAll);
    

    希望这会有所帮助。

    【讨论】:

    • 非常感谢,我将重建我的构造函数。但是我不明白为什么 first.b.b1 和 first.__proto__.b.b1 和 window.TEST.prototype.b.b1 是一样的逻辑?
    • @Oddis 因为只有一个对象,而且TEST.prototype.bfirst.bsecond.b都指向它
    • 感谢 Bergi 和 Mykola,我接受了。但我认为我因这种行为而失去了资源。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2022-07-27
    • 2018-06-20
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    相关资源
    最近更新 更多