Javascript странная проблема вложенного присваивания в литерале объекта - PullRequest
3 голосов
/ 16 ноября 2011

У меня есть свойство объекта JS, определенное в литерале объекта:

reqHeader: [{name:'Chris'},{age:'06'}]

, которое я вкладываю в другое свойство в том же литерале объекта:

content: {headers:
              {reqHeader: this.reqHeader}
          },

Теперь, когда я пытаюсьчтобы получить доступ к этому из метода в том же самом литерале объекта, он говорит, что он неопределен:

getHeaders: function(){
    var a = this.content['headers']['reqHeader'];
    alert(a);
}

Полный код: http://jsfiddle.net/Amnesiac/zZP83/5/

Спасибо, Крис.

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Это не сработает, потому что this не является ссылкой на этот объект. То есть, , а не - это тот случай, когда JavaScript устанавливает this для ссылки на объект, который находится "в стадии разработки" внутри литерального блока объекта. Оно остается равным тому, что находится за пределами этого выражения.

Что вы можете сделать, это что-то вроде:

var obj = {
  reqHeaders: /* whatever */,
  content: {
    headers: {
    }
  }
};

obj.content.headers.reqHeader = obj.reqHeader;
1 голос
/ 16 ноября 2011

В вашем JsFiddle у вас есть:

var obj={

    reqHeader: [{name:'Chris'},{age:'06'}],

    content: {
        headers: {
            reqHeader:this.reqHeader
        }
    },

    getHeaders: function(){
        var a = this.content['headers']['reqHeader'];
        alert(a);
    }
}

obj.getHeaders();

Но когда вы ссылаетесь на this.reqHeader в определении content.headers.reqHeader, переменная this не указывает на главный объект.В самом деле, если вы дадите этой строке следующую строку:

    content: {
        headers: {
            reqHeader: 'Hello!'
        }
    },

, она сработает и предупредит слово Hello!.

1 голос
/ 16 ноября 2011

@ Pointy прав, this в вашем случае означает глобальный объект, но не объект obj, если вы хотите, чтобы this ссылался на ваш obj, вам нужно сделать его экземпляром некоторого класс / функция:

var obj= new (function a(){

    this.reqHeader = [{name:'Chris'},{age:'06'}];

    this.content = {headers:{reqHeader:this.reqHeader}

            };

    this.getHeaders = function(){
        var a = this.content['headers']['reqHeader'];
        alert(a);
    };

});

obj.getHeaders();

здесь jsfiddle для этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...