Javascript: есть ли ключевое слово для ссылки на текущий узел в объекте? - PullRequest
1 голос
/ 12 февраля 2011

Рассмотрим следующий код:

function Animal(){
  this.type = "dog";
  this.color = {
                 stomach: "white",
                 paws: "brown",
                 face: function(){
                   if(this.color.stomach === "white"){
                      return "red";
                   }else{
                      return "blue";
                   }
                 }
}

Эта странно окрашенная собака имеет цвет лица, который зависит от цвета его живота. Мне интересно, есть ли более синтаксически простой способ написания части "this.color.stomach". Т.е. «это» относится к основному объекту «Животное». Есть ли подобное ключевое слово, которое ссылается на родительский объект, в котором это ключевое слово вызывается? Например, поскольку я уже нахожусь внутри Animal.color, вместо того, чтобы повторять эту часть, чтобы получить ее цвет живота (Animal.color.stomach), есть способ напрямую ссылаться на свойство color, чтобы как «parent.stomach», где «parent» относится к какому-либо свойству, в котором он вызывается - в данном случае, Animal.color?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Вы пробовали запустить свой код?Поскольку this на самом деле действительно относится к color, а не к Animal объекту.

Вот как это работает: this относится к любому объекту, к которому была вызвана функцияи в обычных условиях ваша face функция будет вызываться как someAnimal.color.face() - в этом случае this уже ссылается на объект color, поэтому this.color будет ошибкой, тогда как this.stomach будет на самом делеработа.

1 голос
/ 13 февраля 2011
function Color(data) {
    this.stomach = data.stomach;
    this.face = data.face;
}

function Animal() {
    var self = this; // self now refers to the animal
    this.type = "Dog";
    this.color = new Color({
        face: function() {
            // in the "face" function, "this" refers to the color
            if (this.stomach === "white") { // color's stomach
                return "red";
            } else if (self.type === "Dog") { // animal's type
                return "Blue";
            }
        }
   });
}
...