0

これは私のコードです

ImageCarousel = (function() {
var currentIndex, imageManager, imagesVO, jsonPath, values;

currentIndex = null;

jsonPath = "json/images.json";

imagesVO = [];

values = null;

imageManager = null;

function ImageCarousel() {
  this.loadJson();
}

ImageCarousel.prototype.loadJson = function() {
  var _this = this;
  return $.ajax(jsonPath, {
    success: function(data, status, xhr) {
      console.log("yea " + data);
      _this.currentIndex = 0;
      _this.imagesVO = data.images;
      _this.imageManager = new ImageManager(data.images);
      _this.imagesCount = _this.imagesVO.length;
      _this.switchToImage(_this.currentIndex);
      $('#next').click(function() {
        _this.currentIndex = _this.incrementIndexByOne(_this.currentIndex);
        return _this.switchToImage(_this.currentIndex);
      });
      return $('#prev').click(function() {
        _this.currentIndex = _this.decrementIndexByOne(_this.currentIndex);
        return _this.switchToImage(_this.currentIndex);
      });
    },
    error: function(xhr, status, err) {
      return $('#imageHolder').html("problem loading the json file, </br>make sure you are running this on your local server");
    },
    complete: function(xhr, status) {}
  });
};

「これ」を使用して ImageCarousel クラス内の変数を参照するのは正しいですか? それらのプロパティを公開しますか?もしそうなら、どうすればそれらを非公開にできますか?

4

2 に答える 2

0

これにはいくつか問題があります。修正を加えたコードは次のとおりです。

var ImageCarousel = function () {
    var currentIndex, imageManager, imagesVO, jsonPath, values;

    currentIndex = null;

    jsonPath = "json/images.json";

    imagesVO = [];

    values = null;

    imageManager = null;

    var _this = this;

    this.loadJson = function () {
        return $.ajax(jsonPath, {
            success: function (data, status, xhr) {
                console.log("yea " + data);
                currentIndex = 0;
                imagesVO = data.images;
                imageManager = new ImageManager(data.images);
                imagesCount = imagesVO.length;
                switchToImage(currentIndex);
                $('#next').click(function () {
                    currentIndex = _this.incrementIndexByOne(currentIndex);
                    return _this.switchToImage(_this.currentIndex);
                });
                return $('#prev').click(function () {
                    currentIndex = _this.decrementIndexByOne(currentIndex);
                    return _this.switchToImage(currentIndex);
                });
            },
            error: function (xhr, status, err) {
                return $('#imageHolder').html("problem loading the json file, </br>make sure you are running this on your local server");
            },
            complete: function (xhr, status) {}
        });
    };
    this.loadJson();    
};

var someCarousel = new ImageCarousel(); // Example usage.

事実上、ImageCarousel2回宣言されました。一度ImageCarousel = (function() {と一度function ImageCarousel()...。私は前者を選びました。

currentIndex私があなたを正しく理解していれば、、、、、、imageManagerおよび値を非公開にする必要がありますimagesVOjsonPathそれらについては、関数ブロック内でvarを実行するだけで、そのnewオブジェクトの各インスタンスにプライベートになります。ImageCarousel関数内で心配することなく(そしてなしで)安全に使用できます_this

(ここでそれらの定義を見ることができない)私はそれらがパブリックメソッドであると仮定しているので、私は_thisあなたが内部で呼び出しているメソッドを残しました。loadJsonプライベートの場合は、ラッパー関数内で宣言するだけで、内部でのみアクセスできます。それらを公開したい場合はthis[functionName]、loadJsonで行ったように使用してください。

したがって、私のコード変更の影響は次のとおりです。

  • currentIndexなどはプライベートです。
  • loadJsonは公開されています。

を使用する上でさらにいくつかのことを編集prototypeします。prototype「静的」関数用です。つまり、その関数はImageCarouselオブジェクトのすべてのインスタンスに存在するわけではありません。これを使用する場合は、関数の宣言の外で使用する必要があります。そうしないと、毎回new不必要ImageCarouselに再定義されてしまいますloadJson。これが私がもう少し明確に意味することを示す素敵な小さなデモアプリです:http://jsfiddle.net/d2BbA/

于 2013-01-22T18:27:29.767 に答える
0

thisいいえ、正しく使用していません。参照しようとしているこれらのプロパティはすべてプライベートです。外部のコードでは、 のプロパティを呼び出して実際にアクセスすることはできませんImageCarousel

なんらかの理由でこれらの変数を公開したい場合は、 を使用して宣言しないでくださいvarthis.currentIndex = null代わりに、またはのようなことをしてくださいthis.jsonPath = "json/images.json"。これを行うと、本質的にそれらのプロパティをパブリックにアクセスできるようになります。ImageCarousel.currentIndex外部コードは、ImageCarousel.jsonPath、 などを呼び出すだけでこれらのプロパティにアクセスできます。

于 2013-01-22T18:05:20.433 に答える