javascript这是指ajax回调后的同一对象

javascript这是指ajax回调后的同一对象,javascript,ajax,closures,this,javascript-objects,Javascript,Ajax,Closures,This,Javascript Objects,我正在尝试使用oauth库来获取推文。我已经创建了一个对象,它接收twitter时间线要获取的url,并将其放在一列中。代码是 lister=function(opts) { this.setresource =lister.setresource; this.config = lister.config; this.config.resource = opts; this.putTweet = lister.putTweet; this.liste

我正在尝试使用oauth库来获取推文。我已经创建了一个对象,它接收twitter时间线要获取的url,并将其放在一列中。代码是

   lister=function(opts) {
    this.setresource =lister.setresource;
    this.config = lister.config;
    this.config.resource = opts;
    this.putTweet = lister.putTweet;
    this.listerstrap = lister.listerstrap;
    this.addStrip = lister.addStrip;
    this.setTweets = lister.setTweets;
    this.addTweets = lister.addTweets;

}    
现在,如果我创建两个新的lister对象

    var l1 = new lister('user1'); //user1 and user2 refer to url of the timelines 
    l1.listerstrap();
    var l2 = new lister('user2');
    l2.listerstrap();
listerstrap函数是:

     lister.listerstrap = function () {
   this.addStrip().setresource().addTweets();

   }
问题发生在addTweets()中

在*处,this(u)指的是同一个(l2实例),因此当调用setTweets时,来自这两个资源的tweet被设置在同一列中

这是一个关闭问题吗


编辑:我试图根据时间线或列表将推文设置为不同的列(就像在Tweetdeck中所做的那样,每个列表都有不同的列)。虽然我从两个URL获得推文,但它们设置在同一列中包含我在addStrip()中创建的每一列对div元素的引用。但是u在回调中引用了同一个实例。我想让它将tweet设置为各自的列

我很确定
\uuu
引用了不同的实例。问题在于,执行以下操作时,您正在覆盖共享配置对象的属性:

this.config = lister.config;
this.config.resource = opts;
因此,您的
l1
l2
始终具有相同的
config
对象。只要实例化
l2
,它就会覆盖
资源
属性

您可能想创建一个克隆:

this.config = clone(lister.config);

如果你读了我之前的答案,那么问题不在于
addTweets
方法:忘掉它

问题是:

this.config = lister.config;
this.config.resource = opts;
构造函数为对象分配引用,而对象本身不会被复制。因此,通过将引用指定给实例,然后更改被引用对象,您正在更改所有实例所引用的对象

快速修复方法是更改
this.config=lister.config类似于:

this.config = {foo: 'bar', something: 'else', resource: opts};//each time the constructor is called, create a new object literal
但是,请注意使用原型,因为将引用分配给函数对象的属性(同时作为构造函数)并不是最好的方法

更新:


作为对OP评论的回应:你所看到的完全有道理。您正在创建一个新实例,将单个
config.resource
对象(只有一个)设置为
User1
,并调用
addTweets
函数。此函数执行异步请求。异步是一个经常被忽略的问题,但在这种情况下非常重要:在调用回调函数(使用
config.resource
值)之前,您创建一个新实例,然后更改
config.resource
属性。在构造第二个实例之前,不会调用回调函数。这就是为什么
config.resource
值在调用
addTweets
和被调用的异步回调之间的那一瞬间发生变化的原因,因为这是创建第二个实例的时候。就这么简单,真的。

也许我的语言模棱两可,你能看看这个问题的编辑吗。另外,当我在setresource()中检查uwk.config.resource时,它在addTweets()之前调用,它们是不同的。。在addTweets()中,在oauth.get()调用之前,uz.config.resource也是不同的。。。。我认为问题在于誓言变量,它在两个变量中都是相同的calls@karyboy:我已经更新了我的答案-我忘了提到
get
请求的回调函数的异步性质,但这就是为什么
config.resource
的值被更改了dthnx@Elias.my bad。它起作用了。。。在代码的复杂性中迷失了方向,我会尽量保持简单。@karyboy:不用担心:-),我们都忽略了这样的事情。。。编写客户端代码,忘记异步请求是浪费时间和挫败感的最常见来源之一。。。也许我的语言模棱两可,你能看看这个问题的编辑吗。另外,当我在setresource()中检查uwk.config.resource时,它在addTweets()之前调用,它们是不同的。。在addTweets()中,在oauth.get()调用之前,uz.config.resource也是不同的。这意味着u在oauth调用之前引用不同的实例。。。我认为问题在于誓言变量,它在两个调用中都是相同的
this.config = {foo: 'bar', something: 'else', resource: opts};//each time the constructor is called, create a new object literal