【问题标题】:How can I stop pass by reference an object stored in prototype?如何停止通过引用存储在原型中的对象?
【发布时间】:2016-05-23 18:33:07
【问题描述】:

我可以将对象定义为原型成员吗?如果是,那么如何通过引用实例化对象来停止调用?

function MediaUser (){
}

MediaUser.prototype.oThumb = {sUrl: 'noImage.png'};

var oMediaUser = new MediaUser();
var oMediaUser2 = new MediaUser();

oMediaUser.oThumb.sUrl = "a.png";

console.log(oMediaUser2.oThumb.sUrl); // prints a.png 

【问题讨论】:

    标签: javascript oop prototype


    【解决方案1】:

    您在原型中定义的所有内容都被所有对象共享。如果您希望所有实例都不同,则必须将其放在构造函数中:

    function MediaUser (){
      this.oThumb = {sUrl: 'noImage.png'}
    }
    
    var oMediaUser = new MediaUser();
    var oMediaUser2 = new MediaUser();
    
    oMediaUser.oThumb.sUrl = "a.png";
    
    console.log(oMediaUser2.oThumb.sUrl); // prints noImage.png 

    【讨论】:

    • 所以@Gothdo,如果我想在另一个对象中添加一个对象,我总是必须将它作为实例成员而不是原型成员?
    【解决方案2】:

    事实上,当您为每个对象寻找单独的值时,完全摆脱原型属性

    function MediaUser (url){
     this.sUrl = url || 'noImage.png';
    }
    
    
    var oMediaUser = new MediaUser("a.png");
    var oMediaUser2 = new MediaUser();
    
    console.log(oMediaUser.sUrl); // prints a.png
    
    console.log(oMediaUser2.sUrl); // prints noImage.png
    

    【讨论】:

    • 不要使用a = a || b 构造,参见stackoverflow.com/questions/2802055/…
    • @Gothdo 只要你知道其中的陷阱,这个结构就很好。不使用它会在很多情况下表现出缺乏理解,就像总是毫无用处地使用===
    • @plalx 好吧,始终使用=== 被认为是一种好习惯。
    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 2013-09-22
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多