我想做一些像Java,C#等经典的面向对象语言很容易做到的事情。我只想访问实例化对象的属性。该对象在浏览器的窗口对象中全局范围,由twitter @anywhere API提供。
对于我的代码示例,假设您已经将用户登录。
如果我使用java,我会说(假设所有字段都是公开的:
twttr = new twtter();
String screenName = twtter.currentUser.data('screen_name');
出于某种原因,这在Javascript中很难实现。我已经得到了一个解决方法,在twitter任何API使用的匿名方法内部工作,我将我想要的值设置为DOM元素,然后将其删除。这很丑陋。我只是想直接访问它。
这是我到目前为止所做的,它甚至没有在eclipse中通过语法检查:
function AnywhereFacade()
{
var twitterReference;
window.twttr.anywhere
(
return function(T)
{
twitterReference = T;
};
)
getValue(propertyToGet)
{
return twitterReference.currentUser.data(propertyToGet);
}
};
var anywhereFacade = AnywhereFacade();
var screen_name = anywhereFacade.getValue("screen_name");
alert("screen name is: " + propertyGetter);
请帮忙!为什么Javascript如此难以使用?我想要做的就是使用我认为的闭包。
谢谢!
答案 0 :(得分:0)
我在我的应用程序中做了类似的事情,因为我使用的是Facebook JavaScript SDK和Twitter SDK,并希望提供一致的界面来访问它们。所以我将变量命名为App
。对于任何地方的Twitter,这就是捕获变量的方式。
window.App = {};
twttr.anywhere(function(T) {
App.Twitter = {
getValue: function(property) {
return T.currentUser.data(property);
},
getPublicTimeline: function() {
return T.Status.publicTimelime();
}
};
});
我们正在调用anywhere
函数并向其传递回调函数。需要回调函数,因为此时可能无法加载任何库。通过传递整个函数,我们说只要加载了任何库,就应该执行这个函数。
现在当库加载时,此函数将执行,定义包含App.Twitter
函数的getValue
属性。在闭包中捕获任何地方或T
对象。
如果你现在打电话,
App.Twitter.getValue("screen_name");
实际上任意对象(T
)将用于获取screen_name属性。
答案 1 :(得分:0)
这就是我需要做的全部。
document.getElementById('messagePanel').innerHTML = "loading...";
window.twttr.anywhere(function(T)
{
document.getElementById('messagePanel').innerHTML = "screen_name: " + T.currentUser.data('screen_name');
});
这让我意识到我的问题只是因为我从异步调用返回twitter时必须使用回调。这帮我解决了如何为gwt包装它的初始问题。