javascript这是指ajax回调后的同一对象
我正在尝试使用oauth库来获取推文。我已经创建了一个对象,它接收twitter时间线要获取的url,并将其放在一列中。代码是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
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