为什么缺少类的属性?

时间:2012-11-25 14:21:18

标签: javascript jquery oop

我想为我自己的对象设置set,可以识别附加的相同对象并使它们掉落。

function ImageSet(){
    this.set = [];
}

ImageSet.prototype.length = function(){return this.set.length}
ImageSet.prototype.process = function(imgObj){
    var is_exist = false;
    $.each(this.set, function(i){
        if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};
    });

    if (!is_exist){
        this.set[this.set.length + 1] = imgObj;
        return true;
    }
    return undefined;
}

var imagesChoosen = new ImageSet();

因此,当用户单击元素时,我创建新对象并尝试将其附加到我的ImageSet。 在第一次单击对象成功附加到set,但在第二次单击控制台上写入错误

TypeError: this.set is undefined if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};  

调用ImageSet的代码是:

$('#content_table a').click(function(event){
    event.preventDefault();
    el = new Image($(this).attr('href'));
    if (imagesChoosen.process(el)){
        $(this).parent().css("border", "3px dotted orange");    
    } else {
        $(this).parent().css("border", "None");
    }
    console.log(imagesChoosen.length());
    return false;
});

我无法理解。第一次通话后我的ImageSet是否会破坏?

3 个答案:

答案 0 :(得分:3)

在匿名函数中传递给each

$.each(this.set, function(i){
    if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};
});

... this的值是当前正在执行的数组的成员,而不是imagesChoosen

要访问它,您需要将this从外部函数复制到另一个仍在范围内的变量。

var is_exist = false;
var currentImageSet = this;
$.each(this.set, function(i){
    if (currentImageSet.set[i].imgHash == imgObj.imgHash){is_exist = true};
});

答案 1 :(得分:1)

this.set[this.set.length + 1] = imgObj;
认为应该是:

this.set[this.set.length] = imgObj;

我不熟悉JQuery的每个功能,但之前的帖子会指示更改此上下文,所以我会更改for each:

$.each(this.set, function(i){
    if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};
});

为:

for(var i=0;i<this.set.length;i++){
    if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};
};

答案 2 :(得分:1)

this表示jquery中的当前迭代,每个迭代都会产生这个类关键字的问题;您正在将此视为普通数组,因此我更喜欢使用for循环!

ImageSet.prototype.process = function(imgObj){
    var is_exist = false;
    for(var i=0; i<this.set.length; i++)
    {
        if (this.set[i].imgHash == imgObj.imgHash){is_exist = true};
    }

    if (!is_exist){
        this.set[this.set.length] = imgObj;
        return true;
    }
    return undefined;
}