Свойство свойства не имеет 'this' как ссылку на объект root - PullRequest
0 голосов
/ 13 января 2020

Я создал следующую переменную:

var orientations = {
    E: {R: this.S, L: this.N},
    W: {R: this.N, L: this.S},
    N: {R: this.E, L: this.W},
    S: {R: this.W, L: this.E},
}

Я пытаюсь сослаться на мой ориентации объект, но в моем коде 'this' ссылается на объект окна. Я предполагаю, что это может быть потому, что я на два уровня вглубь объекта. Есть ли способ ссылаться на ориентации самого объекта?

Ответы [ 3 ]

0 голосов
/ 13 января 2020

лучшее, что я могу сделать ... (там лучше?)

const orientations= { E: { RL: 'SN' } 
                    , W: { RL: 'NS' } 
                    , N: { RL: 'EW' } 
                    , S: { RL: 'WE' } 
                    } 

for(let o in orientations) {
  orientations[o].R = orientations[ orientations[o].RL.charAt(0) ]
  orientations[o].L = orientations[ orientations[o].RL.charAt(1) ]
  delete orientations[o].RL  // no more needed
}

console.log( orientations.W.R === orientations.N  )
0 голосов
/ 13 января 2020

Один из способов получить доступ к вашему коду this:

var obj = {
  E: {},
  W: {},
  N: {},
  S: {},
  
  initMyself: function() {
    Object.assign(this.E, {R: this.S, L: this.N});
    Object.assign(this.W, {R: this.N, L: this.S});
    Object.assign(this.N, {R: this.E, L: this.W});
    Object.assign(this.S, {R: this.W, L: this.E});
  }
};

obj.initMyself();

console.log(obj.E.R === obj.S);

Простое правило: если у вас есть obj.fn(), то внутри кода fn() this связан с obj. Но если у вас есть g = obj.fn;, а затем g(), код внутри g() будет иметь this, привязанный к глобальному объекту.

И ваше требование также может иметь ссылки "self". Вы устанавливаете E.R для ссылки на S, но S еще не существует. Вот почему мой код сначала создал их, а затем Object.assign() в значительной степени просто скопировал свойства.

Object.assign(this.E, {R: this.S, L: this.N});

это просто

this.E.R = this.S;
this.E.L = this.N;

Один из способов, которым ваш код мог бы быть это:

var orientations = (function() {
  var obj = {
    E: {},
    W: {},
    N: {},
    S: {},

    initMyself: function() {
      Object.assign(this.E, {R: this.S, L: this.N});
      Object.assign(this.W, {R: this.N, L: this.S});
      Object.assign(this.N, {R: this.E, L: this.W});
      Object.assign(this.S, {R: this.W, L: this.E});
    }
  };

  obj.initMyself();
  delete obj.initMyself;

  return obj;
}());

console.log(orientations.E.R === orientations.S);
0 голосов
/ 13 января 2020

Способ использования this недействителен. this будет определяться только так, как вы хотите, если бы оно было в новой лексической области. См. Этот вопрос Самостоятельные ссылки в объектных литералах / инициализаторах

...