这是我的代码
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类中的变量?它会公开这些属性吗?如果是这样,我该如何保密?
答案 0 :(得分:0)
不,你没有正确使用this
。您尝试引用的那些属性都是私有的,因为没有外部代码可以通过调用ImageCarousel
的某些属性来真正访问它们。
如果您确实希望因任何原因公开这些变量,请不要使用var
声明它们。相反,请执行this.currentIndex = null
或this.jsonPath = "json/images.json"
之类的操作。当您这样做时,您实际上是可以公开访问这些属性。任何外部代码都可以通过调用ImageCarousel.currentIndex
,ImageCarousel.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()...
。我选择了前者。
如果我理解正确,您希望currentIndex
,imageManager
,imagesVO
,jsonPath
和值为私有。对于那些,只需在您的功能块中执行var,它们将对该new
'd对象的每个实例都是私有的。您可以在ImageCarousel
功能中安全地使用它们而不用担心(并且没有_this
)。
我将_this
留给了loadJson
内部调用的方法,因为(这里无法看到它们的定义)我假设它们是公共方法。如果它们是私有的,只需在包装函数中声明它们,它们只能在其中访问。如果您希望它们公开,请使用this[functionName]
,因为我已经完成了loadJson。
因此我的代码更改的影响是:
修改强>
使用prototype
时还有一些事情要做。 prototype
用于“静态”函数 - 这意味着,ImageCarousel
个对象的每个实例都不存在该函数。如果您使用它,您将在函数声明之外使用它。否则,每当您new
ImageCarousel
时,它将不必要地重新定义loadJson
。这是一个很好的小型演示应用程序,可以更清楚地显示我的意思:http://jsfiddle.net/d2BbA/