2013-01-15 99 views
-1

我试图建立一个node.js中的API reddit的包装我对OO javascript相当陌生,而且我正在为我的reddit对象的属性赋值。Javascript对象属性未定义

var request = require("request"); 
var subreddit = require("./subreddit").subreddit; 

var reddit = function() { 

    var self = this, 
     userAgent = "node.js api wrapper - https://github.com/theyshookhands/rednode", 
     debug = false, 
     cookie = "", 
     uh = ""; 

    self.getJSON = function (url, data, callback) { 
    data["api_type"] = "json"; 
    request(url, { qs: data }, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     callback(body); 
     } 
    }); 
    }; 

    self.post = function (url, data, callback) { 
    console.log("in post"); 
    console.log("cookie: " + self.cookie); 
    console.log("uh: " + self.uh); 
    data["api_type"] = "json"; 
    if (self.cookie) { 
     request.cookie(self.cookie); 
     console.log("cookie assigned"); 
    } 
    if (self.uh) { 
     data["uh"] = self.uh; 
     console.log("uh assigned"); 
    } 
    console.log("requesting"); 
    request.post(url, { form: data }, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     console.log("no errors"); 
     callback(body); 
     } 
    }); 
    }; 

}; 

reddit.prototype = { 

    login: function (username, password, callback) { 
    var data = { 
     "user": username, 
     "passwd": password, 
     "rem": false 
    }; 

    this.post("http://www.reddit.com/api/login", data, function (body) { 
     var response = JSON.parse(body); 
     this.uh = response["json"]["data"]["modhash"]; 
     this.cookie = response.json.data.cookie; 
     console.log("rednode --> logged in as: " + username); 
     callback(); 
    }); 
    }, 

    setUserAgent: function (userAgent) { 
    this.userAgent = userAgent; 
    }, 

    r: function (name, callback) { 
    var sr = new subreddit(name); 
    if (callback) { 
     sr.exec(callback); 
    } 
    return sr; 
    }, 

    postLink: function (sr, title, url, callback) { 
    var data = { 
     "kind": "link", 
     "sr": sr, 
     "title": title, 
     "url": url 
    }; 
    console.log("calling post"); 
    this.post("http://www.reddit.com/api/submit", data, callback); 
    } 
} 

exports.reddit = reddit; 

的目标是在15行定义和16它们在线路62的给定值和63为什么我没有使用

this.cookie, this.modhash 

语法实现这些价值?

+1

谢谢,李。我不确定链接github页面或将它发布在这里更合适。 – gwely

回答

1

在功能:

var reddit = function() { 

为什么要用函数表达式,其中一个函数声明会做的,可能是更清晰?按照惯例,施工开始用大写字母:

function Reddit() { 

在功能:

var self = this, 

的值的函数的this由功能是如何调用完全确定。由于这是一个构造函数,因此在调用new时,其this将引用新构造的对象(构造函数的“实例”)。

var self = this, 
     userAgent = "...", 
     debug = false, 
     cookie = "", 

上面创建变量本地执行对象的可变对象。您只能通过名称访问变量,它们在执行对象的作用域链上解析,以全局对象结束。

... 
self.post = function (url, data, callback) { 
    console.log("in post"); 
    console.log("cookie: " + self.cookie); 

这里,LHS上的self引用了Reddit实例。在RHS上,函数表达式对外部作用域具有闭包,所以其self也引用相同的实例,因此您正在寻找对象及其[[Prototype]]链上的cookie属性。

但是,您将cookie声明为构造函数的局部变量,因此标识符将沿着错误的链进行解析(即您应该在作用域链上查找变量,而不是对象链上的属性) 。

碰巧的是,由于封闭的,你可以使用:

console.log("cookie: " + cookie); 

解决的作用域链cookie

但好像你真的想访问它作为一个属性,所以才使之成为公共财产摆在首位:

var self = this, 
     userAgent = "...", 
     debug = false; 

    this.cookie = "", // or self.cookie = '', 
    ... 

现在你可以使用self.cookie

+0

感谢您的深入解释。它帮助了很多。我不是由我的代码ATM,所以我不能尝试它,但我不会仍然有一个问题访问来自登录功能的'cookie'和'uh'属性?那就是我迷失在“这个”所指的那个地方。 – gwely

+0

实际上它来自登录功能中的匿名函数。 – gwely

1

当您使用关键字this引用你有你的“对象”定义的属性,他们必须是函数/对象的相同范围内。

您正在错误地使用this关键字来引用函数/对象变量/属性,该函数/对象变量/属性在未命名的回调函数的范围内将实际上称为reddit.cookie

但是,您必须声明Cookie为this.cookie ="";,因为它可以被访问为reddit.cookie

+0

使用this.cookie和this.uh声明它们是有道理的。但是,使用reddit.cookie和reddit.uh访问它们似乎并不奏效...... – gwely

+0

@theyshookhands这是假设您在全局范围内声明了变量'reddit',并且它没有包含在其他函数中,或者对象。 –

0

JavaScript并没有真的在你试图用它们的方式私有实例变量的概念。

只有公共成员可以访问这种方式(说this.whatever =“”明确设置)。

否则,你仍然可以通过降低自身访问它们像任何其他变量。在他们面前。

0

在您的reddit构造函数中,可以定义私有变量,如userAgent,cookie。要为reddit对象实例定义的公共属性,则必须继续这样在你的构造函数:

this.debug = false; 

更多信息,请参见this Douglas Crockford article