Обращаясь к объекту javascript proprty (используя это) при его создании - PullRequest
4 голосов
/ 09 сентября 2011

Можете ли вы объяснить мне, почему этот объект не понимает "это"?

var circle = {
                radius : 20,
                x : 100 - this.radius / 2,
                y : 100 - this.radius / 2,
             }

console.log(circle.x) // returns NaN, why?

Ответы [ 5 ]

5 голосов
/ 09 сентября 2011
  1. потому что это не так, как this работает в JS. this будет ссылкой на ваш объект, только если вы каким-то образом заставите назначить ваш объект как значение this контекста вызова функции.

  2. вы не можете ссылаться на литерал объекта от самого себя, пока он создается, потому что он еще не существует.

Если вы создаете круги, вы можете рассмотреть возможность использования конструктора:

 function Circle(radius) {
    this.radius = radius,
    this.x = 100 - this.radius / 2,
    this.y = 100 - this.radius / 2,
 }

 var circle_20 = new Circle( 20 );

Поскольку вы вызываете Circle в качестве конструктора, используя new, this внутри вызова конструктора будет ссылкой на создаваемый объект. Этот объект неявно возвращается, поскольку вы явно не возвращаете какой-либо другой объект.

3 голосов
/ 09 сентября 2011

Вот простая иллюстрация:

//Saul was born:  Initialize the parent!
var parent = {
    youngestChild: 'Small Saul'
};

//Tim was born:  Overwrite the parent!
parent = {
    youngestChild: 'Tiny Tim',
    currentYoungestChild: parent.youngestChild
};

alert(parent.currentYoungestChild);

Кто такой parent.currentYoungestChild?
Как и многие разработчики, я думал, что parent.youngestChild будет установлен на 'Tiny Tim', прежде чем он будет установлен на parent.child.Если бы это было так, было бы установлено 'Tiny Tim'.

Однако, получается, что все дети оцениваются до того, как будут сохранены на их родителе , поэтому

parent.currentYoungestChild == 'Small Saul'

Здесь - скрипкаесли вы хотите попробовать это.

Одним из объяснений этой функциональности является то, что тогда порядок дочерних объявлений не имеет значения .Например, следующее будет иметь другой результат, если объекты будут оцениваться и храниться последовательно:

parent = {
    currentYoungestChild: parent.youngestChild,
    youngestChild: 'Tiny Tim'
}; 

Короче говоря: Инициализация дочерних элементов из других дочерних элементов в объявлении объекта не будет работать!

2 голосов
/ 09 сентября 2011

Поскольку там, где это определяется, this не является circle объектом.

Как насчет:

var circle = {
  radius: 20,

  getX: function() { return (100) - this.radius / 2; },
  getY: function() { return (100) - this.radius / 2; }
}
1 голос
/ 09 сентября 2011

Объект еще не существует.Он существует только после вычисления всего, поэтому при вычислении слишком рано использовать объект.

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

var circle = (function() {
    var radius = 20,
        x      = 100 - radius / 2,
        y      = 100 - radius / 2;

    return { radius: radius,
             x:      x,
             y:      y      };
})();

// now circle is the wanted object,
// and you don't leave the `var` variables separately.
0 голосов
/ 09 сентября 2011

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

Нет способа сделать то, что вы пытаетесь (внутри объявления объекта) в JavaScript.Единственный обходной путь будет что-то вроде:

var newRadius = 20

var circle = {
                 radius: newRadius,
                 x: 100 - newRadius / 2,
                 y: 100 - newRadius / 2
             };

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