将数组传递给函数 - 不要更新

时间:2014-02-08 22:42:26

标签: javascript

很抱歉这个问题,但我是JavaScript新手 我已经定义了一个对象

define(['sharedServices/pubsub', 'sharedServices/topics'], function (pubsub,topics) {
    'use strict';

    function Incident() {
        var that = this;
        this._dtasks = [];

        this.handlePropertyGet = function(enstate, ename) {
            if (!this.entityAspect || !this.entityAspect.entityManager || !this.entityAspect.entityManager.isReady) {
                enstate = [];
            } else {
                enstate = this.entityAspect.entityManager.executeQueryLocally(new breeze.EntityQuery(ename).where('IncidentID', 'eq', this.IncidentID));
            }

            return enstate;
        };

        Object.defineProperty(this, 'DTasks', {
            get: function () {
                return this.handlePropertyGet(this._dtasks, "DTasks");
            },
            set: function (value) { //used only when loading incidents from the server
                that.handlePropertySet('DTask', value);
            },
            enumerable: true
        });
    }

    return {
        Incident: Incident
    };
});

当我调用属性DTasks时内部成员_dtask等于[],即使我输入get属性,我看到当handlePropertyGet完成并返回到获取范围时,enstate填充了对象_dtasks仍然是空的,它不应该作为参考传递吗?

2 个答案:

答案 0 :(得分:0)

this._dtasks“指向”数组。如果您将其作为参数传递给this.handlePropertyGet,则可以使enstate引用相同的数组。

如果您更改数组(如enstate.push("bar")中所示),则更改也会影响this._dtasks:您实际上不会更改它们,只会更改它们指向的数组。

然而,行

enstate = []

enstate = this.entityAspect.entityManager.executeQueryLocally(new breeze.EntityQuery(ename).where('IncidentID', 'eq', this.IncidentID));

不要修改已有的阵列。相反,他们创建新数组并更改enstate以便指向它们。但是,this._dtasks保持不变。

修复它的一种简单方法是将getter中的代码更改为

return this.handlePropertyGet("_dtasks", "DTasks");

handlePropertyGet

this.handlePropertyGet = function(enstate, ename) {
    if (!this.entityAspect || !this.entityAspect.entityManager || !this.entityAspect.entityManager.isReady) {
        this[enstate] = [];
    } else {
        this[enstate] = this.entityAspect.entityManager.executeQueryLocally(new breeze.EntityQuery(ename).where('IncidentID', 'eq', this.IncidentID));
    }
    return this[enstate];
};

这样,您将直接更改this._dtasks的值。

作为替代方案,您可以通过将enstate = []更改为enstate.length = 0(清除数组而不是更改变量来实现相同的结果。请参阅https://stackoverflow.com/a/1232046/3191224)和enstate = this.entityAspect.[...]

var newContent = enstate = this.entityAspect.entityManager.executeQueryLocally(new breeze.EntityQuery(ename).where('IncidentID', 'eq', this.IncidentID));
enstate.length = 0;
Array.prototype.push.apply(enstate, newContent);

清除数组然后从另一个数组中推送所有元素,有效地替换整个内容而不更改enstate本身。

答案 1 :(得分:0)

我的猜测是你正在尝试做这样的事情

的Javascript

function Incident() {
    var reset = false;

    this._dtasks = [];

    this.handlePropertyGet = function (ename) {
        if (reset) {
            this._dtasks = [];
        } else {
            this._dtasks = [1, 2, 3];
        }

        return this._dtasks;
    };

    Object.defineProperty(this, 'DTasks', {
        get: function () {
            return this.handlePropertyGet("DTasks");
        },

        enumerable: true
    });
}

var x = new Incident();

console.log(x.DTasks);

输出

[1, 2, 3] 

jsFiddle

因此,您可以将此简化示例与@ user3191224

提供的想法一起使用