-1

node.js 用の reddit API ラッパーを構築しようとしています。私は OO JavaScript を初めて使用し、reddit オブジェクトのプロパティに値を割り当てる際に問題が発生しています。

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

構文?

4

4 に答える 4

1

関数内:

var reddit = function () {

関数宣言が機能し、おそらくより明確な場合に、関数式を使用するのはなぜですか? 慣例により、コンストラクターは大文字で始まります。

function Reddit() {

関数内:

  var self = this,

関数の値は、関数のthis呼び出し方法によって完全に決定されます。newこれはコンストラクターであるため、 willで呼び出されるとthis、新しく構築されたオブジェクト (コンストラクターの「インスタンス」) を参照します。

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

上記は、ローカル実行オブジェクトの変数オブジェクトに変数を作成します。変数には名前でのみアクセスできます。それらはグローバル オブジェクトで終わる実行オブジェクトのスコープ チェーンで解決されます。

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

ここでselfは、LHS で Reddit インスタンスを参照しています。RHS では、関数式に外側のスコープへのクロージャーがあるため、同じインスタンスも参照するため、オブジェクトとそのチェーンselfのプロパティを探しています。cookie[[Prototype]]

しかし、コンストラクターのローカル変数として宣言cookieしたため、識別子が間違ったチェーンに沿って解決されています (つまり、オブジェクト/チェーンのプロパティではなく、スコープ チェーンの変数を探す必要があります[[Prototype]])。

閉鎖のために、次を使用できるのはたまたまです。

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

cookieスコープチェーンで解決します。

しかし、本当にプロパティとしてアクセスしたいように見えるので、最初にパブリック プロパティにしてください。

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

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

を使用できるようになりself.cookieました。

于 2013-01-15T03:52:39.060 に答える
1

キーワードthisを使用して「オブジェクト」で定義したプロパティを参照する場合、それらは関数/オブジェクトの同じスコープ内にある必要があります。

名前のないコールバック関数のスコープ内でthis実際に呼び出される関数/オブジェクト変数/プロパティを参照するキーワードを誤って使用しています。reddit.cookie

this.cookie ="";ただし、Cookieにアクセスできるように宣言する必要がありますreddit.cookie

于 2013-01-15T02:35:35.077 に答える
0

JavaScript には、使用しようとしている方法でプライベート インスタンス変数の概念が実際にはありません。

その方法でアクセスできるのは、パブリック メンバー (明示的に this.whatever = "" と指定して設定) のみです。

それ以外の場合は、self を削除することで、他の変数と同様にアクセスできます。彼らの前では。

于 2013-01-15T02:35:56.797 に答える
0

コンストラクター関数では、 、 などのredditプライベート変数を定義します。オブジェクト インスタンスのパブリック プロパティを定義するには、コンストラクター関数で次のように処理する必要があります。userAgentcookiereddit

this.debug = false;

詳細については、この Douglas Crockford の記事を参照してください。

于 2013-01-15T02:36:49.867 に答える