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) {}
  });
};

我是否适合使用“this”来引用 ImageCarousel 类中的变量?它会公开这些属性吗?如果是这样,我如何将它们保密?

4

2 回答 2

0

不,你没有this正确使用。您尝试引用的那些属性都是私有的,因为没有外部代码可以通过调用ImageCarousel.

如果您出于某种原因确实想让这些变量公开,请不要使用var. 相反,请执行类似this.currentIndex = nullor的操作this.jsonPath = "json/images.json"。当您这样做时,您实际上是在使这些属性可公开访问。任何外部代码都可以通过调用ImageCarousel.currentIndex,ImageCarousel.jsonPath等来访问这些属性。

于 2013-01-22T18:05:20.433 回答
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.

实际上,ImageCarousel被宣布了两次。一次ImageCarousel = (function() {和一次function ImageCarousel()...。我选择了前者。

如果我理解正确,您希望currentIndex, imageManager, imagesVO, jsonPath, 和 values 是私有的。对于那些,只需在你的功能块内做一个 var ,它们将是该new'd 对象的每个实例的私有。你可以在你的ImageCarousel函数中安全地使用它们,不用担心(也没有_this)。

我留下_this了您在其中调用的方法,loadJson因为(无法在此处看到它们的定义)我假设它们是公共方法。如果它们是私有的,只需在包装函数中声明它们,它们只能在其中访问。如果您希望它们公开,请this[functionName]像我对 loadJson 所做的那样使用。

所以我的代码更改的影响是:

  • currentIndex 等是私有的。
  • loadJson 是公开的。

编辑 关于使用的更多内容prototypeprototype用于“静态”函数 - 意思是,该函数并不存在于每个ImageCarousel对象实例中。如果你使用它,你将在函数声明之外使用它。否则,每次您都new将不必要ImageCarousel地重新定义。loadJson这是一个不错的小演示应用程序,可以更清楚地说明我的意思:http: //jsfiddle.net/d2BbA/

于 2013-01-22T18:27:29.767 回答