为什么这个数组不能从JavaScript“类”正确返回

时间:2010-11-09 09:14:17

标签: javascript arrays reference return-value

我说“类”因为JS在技术上并不存在。但这是我的简化课程

function clsDragStack(divWithin,divConstrain,arrOptions){
    var _divWithin,_divCont,_divOption,_arrOptions;
    var _sourceStack=[];    // array to hold jQuery items referencing remaining source items. initally ALL items will be in this array.
    var _selectStack=[];    // array to hold jQuery items referencing items the user has selected.

    //start constructor

    _divWithin=divWithin;
    _arrOptions=arrOptions;
    _divCont = $('div[ID^="divContainer"]',divWithin);
    _divOption = $('div[ID^="divOption"]',divWithin);;

    initDraggables(divConstrain);

    //end constructor

    function initDraggables(divConstrain){
        var divDraggables = $(".draggableBasic",_divCont);                              //get all the draggable divs
        divDraggables.each(function(i){_sourceStack.push($(this));});          //add all the children to sourcestack
    };

    clsDragStack.prototype.selected = function (){
        return _selectStack;
    };
};

这可能不会孤立地做任何有用的事情,但它显示了感兴趣的部分。基本上我左边有一个列(由_sourceStack在类中表示)用户可以将项目从这里拖到另一列(由_selectStack表示)。这一切都运行正常,_sourceStack和_selectStack数组很快就被洗牌了。但是,当我尝试使用...

从类外部访问_selectStack的内容时
        var arrFields=selectStack.selected();

...例如 - 我似乎总是得到原始堆栈,即空。如果我尝试以与获取原始完整列表相同的方式访问_sourceStack,就好像没有项目被移动一样。当我移动项目时,我可以看到_sourceStack和_selectStack被修改。

在传递 之前,是否需要在selected()中复制数组?为什么我似乎无法传递对此对象的引用?我已经用简单的字符串数组做了一个实验,它运行正常。是因为这些是jQuery对象的数组吗?

2 个答案:

答案 0 :(得分:0)

我见过的所有代码都定义了函数之外的原型成员,例如:

function clsDragStack(divWithin,divConstrain,arrOptions){
     this._selectStack=[];
     //...
};

clsDragStack.prototype = {
    selected: function() {
        return this._selectStack;
    }

};

数组中包含的无关紧要。

使用您的代码,每次创建新的clsDragStack对象时,原型函数selected都会更改为返回最新生成的对象的_selectStack。因此,每个现有的对象都将返回新的(空)数组。

答案 1 :(得分:0)

确定。这就是我做到的。我换了......

clsDragStack.prototype.selected = function (){
    return _selectStack;
};

...与

return {
    selected : function(){
        return _selectStack;
    }
};

..仍然在班级的主体内。

如果有人能向我解释这里到底发生了什么,我将非常感激!特别是这个return {name: function(){}};结构是什么 - 以及为什么在我的原始实现中它返回原始数组,即使它已经被修改了?