我在JavaScript中使用“this”正确的方式?

时间:2013-01-22 17:59:30

标签: javascript jquery oop

这是我的代码

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类中的变量?它会公开这些属性吗?如果是这样,我该如何保密?

2 个答案:

答案 0 :(得分:0)

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

如果您确实希望因任何原因公开这些变量,请不要使用var声明它们。相反,请执行this.currentIndex = nullthis.jsonPath = "json/images.json"之类的操作。当您这样做时,您实际上是可以公开访问这些属性。任何外部代码都可以通过调用ImageCarousel.currentIndexImageCarousel.jsonPath等来访问这些属性。

答案 1 :(得分:0)

这有一些问题。这是代码w /更正:

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()...。我选择了前者。

如果我理解正确,您希望currentIndeximageManagerimagesVOjsonPath和值为私有。对于那些,只需在您的功能块中执行var,它们将对该new'd对象的每个实例都是私有的。您可以在ImageCarousel功能中安全地使用它们而不用担心(并且没有_this)。

我将_this留给了loadJson内部调用的方法,因为(这里无法看到它们的定义)我假设它们是公共方法。如果它们是私有的,只需在包装函数中声明它们,它们只能在其中访问。如果您希望它们公开,请使用this[functionName],因为我已经完成了loadJson。

因此我的代码更改的影响是:

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

修改 使用prototype时还有一些事情要做。 prototype用于“静态”函数 - 这意味着,ImageCarousel个对象的每个实例都不存在该函数。如果您使用它,您将在函数声明之外使用它。否则,每当您new ImageCarousel时,它将不必要地重新定义loadJson。这是一个很好的小型演示应用程序,可以更清楚地显示我的意思:http://jsfiddle.net/d2BbA/