Почему JavaScript {this} не ссылается на родительский объект? - PullRequest
0 голосов
/ 07 сентября 2011

При создании объектов я предполагал, что this вернет экземпляр объекта - вместо этого кажется, что это что-то другое.Почему это так?

var Obj = { 
    foo : 'value',
    bar : function() { return this.foo; } // Error
    bar : function() { return Obj.foo; }  // Works
}

Обновление: Я должен что-то упустить, потому что в некоторых случаях использование this внутри объектов не работает.Почему это только ссылается на экземпляр объекта , иногда ?

Ответы [ 4 ]

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

В функции JavaScript this устанавливается в зависимости от того, как была вызвана функция.

В вашем примере Obj, если вы исправите синтаксическую ошибку и используете запятые между свойствами:

var Obj = {
  foo : 'value', // needs comma, not semicolon
  bar : function() { return this.foo; }
}

Если вы используете синтаксис «точка» на Obj для вызова функции bar, тогда this будет автоматически установлен на Obj:

Obj.bar(); // this will be Obj

Это простой способубедитесь, что this настроен так, как вы хотите.Но если вы вызываете функцию каким-либо другим способом, this может быть установлен на что-то другое:

var nonObjBar = Obj.bar; // get a reference to the function
nonObjBar(); // this will (probably) be `window`, but depends if
             // in strict mode or inside some other function, etc

var Obj2 = { foo: "other foo" };
Obj.bar.call(Obj2); // the .call() method sets this to Obj2
                    // so bar will return Obj2's foo, "other foo"

В этом последнем примере используется метод .call() для Obj.bar для вызова функции таким образом, чтобыпозволяет установить this на что угодно (строгий или нестрогий режим влияет на то, как это работает в некоторых случаях).

Может показаться странным, если вы работаете с такими языками, как Java, но JavaScriptфункции не принадлежат какому-либо данному объекту.Это поведение довольно четко определено и нарочно.

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

Это так.Синтаксическая проблема.

Использование запятых для разделения элементов объекта

var Obj = { 
    foo : 'value',
    bar : function() { return this.foo; },
}

в функциях-членах this относится к ссылке на объект, для которого вызывается функция.

Пример jsFiddle

1 голос
/ 07 сентября 2011

После исправления точки с запятой после «значения» это выглядит следующим образом:

var Obj = { 
    foo : 'value',
    bar : function() { return this.foo; } // Error
};

alert(Obj.bar());   // alerts 'value'

См. Рабочий jsFiddle здесь: http://jsfiddle.net/jfriend00/UFPFf/.

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

0 голосов
/ 07 сентября 2011

У вас не должно быть точки с запятой после foo.

На самом деле, когда вы звоните Obj.bar, у вас будет иметь это в отношении Obj.

См. http://jsfiddle.net/AAkbR/

var Obj = { 
    foo : 'value',
    bar : function () { return this.foo; }
};

alert(Obj.bar() === Obj.foo);

Предупреждения верны.

...