цикл инициализации литерала javascript - PullRequest
2 голосов
/ 16 апреля 2010

У меня есть объект, у которого есть несколько свойств, которые устанавливаются при создании объекта.

Этот объект недавно был изменен на буквальное обозначение объекта, но я столкнулся с небольшой проблемой, которую не выявляет поиск в сети.

Проще говоря, мне нужно сделать это:

Star = function(_id, _x, _y, _n, _o, _im, _c, _b, _links) {
    var self = {
        id: _id,
        // other properties
        links: [],
        for (var i=0,j=0;i<8;i++) { //<- doesn't like this line
            var k = parseInt(_links[i]);
            if (k > 0) {
                this.links[j++] = k;
            }
        },
        // other methods
    };
    return self;
};

Как инициализировать свойство в конструкторе в литеральной нотации объекта?

Ответы [ 3 ]

3 голосов
/ 16 апреля 2010
  1. Вы можете создать массив на лету, используя анонимную функцию:

    Star = function(_id, _x, _y, _n, _o, _im, _c, _b, _links) {
        var self = {
            id: _id,
            // other properties
            links: (function() {
                var a = [];
                for (var i=0;i<8;i++) {
                    var k = parseInt(_links[i]);
                    if (k > 0) {
                        a.push(k);
                    }
                }
                return a;
            })(),
            // other methods
        };
        return self;
    };
    
  2. Вы можете сделать это после определения литерала:

    Star = function(_id, _x, _y, _n, _o, _im, _c, _b, _links) {
        var self = {
            id: _id,
            // other properties
            links: [],
            // other methods
        };
        for (var i=0,j=0;i<8;i++) {
            var k = parseInt(_links[i]);
            if (k > 0) {
                self.links[j++] = k;
            }
        }
        return self;
    };
    
1 голос
/ 16 апреля 2010

В этом конкретном примере вы можете использовать анонимную функцию, например:

Star = function(_id, _x, _y, _n, _o, _im, _c, _b, _links) {
    var self = {
        id: _id,
        // other properties
        links: (function(){
            var links = [];
            for (var i=0;i<8;i++) {
                var k = parseInt(_links[i]);
                if (k > 0) {
                    links.push(k);
                }
            }
            return links;
        })(),
        // other methods
    };
    return self;
};
0 голосов
/ 16 апреля 2010

Вы не можете. Нотация объекта не позволяет этого. Однако вы можете добавить свойства ПОСЛЕ инициализации вашего объекта.

Кстати, self - это уже определенный объект, который является псевдонимом для оконного объекта. Хотя вы определяете временный объект с именем self [и, следовательно, вы не избавляетесь от window.self], это не то, что вы должны делать. Действуйте так, как если бы self было ключевым словом, и его текущее использование запрещено.

...