2013-07-29 3 views
0

Когда я объявить новый тип объекта:JavaScript - Что это значит?

var MyType = function(constructorArg) { 
    this.whatever = constructorArg; 
}; 

var myTypeInstance = new MyType('hehe'); 

В этом случае this относится к функции, назначенной на MyType.

Теперь давайте добавим простой аксессор для свойства whatever (без использования прототипа):

var MyType = function(constructorArg) { 
    this.whatever = constructorArg; 
    this.getWhatever = function() { 
     // Here this should logically point to the function assigned 
     // to this.whatever instead of the current instance of MyType. 
     return this.whatever; 
    }; 
}; 

Это работает правильно?

Но почему нет this, внутри тела функции, присвоенной свойству whatever, не указывая на эту функцию?

Благодарим за помощь!

EDIT: Я изменю мой пример:

var MyType = function(arg) { 
    this.property = arg; 
    this.MySubType = function(subTypeArg) { 
     this.subTypeProperty = subTypeArg; 
     // What is "this" refereing to here ? 
     // To the instance of MyType, or to the instance of MySubType ? 
     // I know it would not make sense to do something like this in real world 
     // but i'm trying to have a clearer understanding of the way "this" is set. 
    }; 
} 

EDIT: Как сказано в комментариях:

При использовании

myTypeInstance.MySubType('hehe'); 

, то это относится к myTypeInstance.

При использовании

var mySubTypeInstance = new myTypeInstance.MySubType('hehe'); 

то это относится к mySubTypeInstance

Если я хорошо понимал.

+4

* «В этом случае' this' относится к функции, назначенной 'MyType'. * * Нет! Если вызывается с 'new',' this' относится к новому объекту, который наследуется от 'MyType.prototype'. 'this' ** never ** относится к самой функции *, если * вы явно не вызываете функцию таким образом (то есть' func.call (func) '). Пожалуйста, ознакомьтесь с [документацией MDN о 'this'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this), он дает хороший обзор о том, как это сделать работает. –

+0

Да, извините, вот что я имел в виду, это относится к экземпляру. Итак, к чему относится «это» в аксессуре? Он должен ссылаться на экземпляр, созданный с использованием 'var instance = new this.whatever();' right? – Virus721

+0

Нигде. Но если 'this.whatever' был« подтипом »вместо аксессора, должна ли ссылка« this »указывать на экземпляр этого подтипа вместо экземпляра« MyType »? – Virus721

ответ

1

Что касается ваших прав, это все равно: зависит от как вы звоните this.MySubType.

  • Если вы назвали это this.MySubType(), т.е.как объектный метод, то (внутри функции) будет ссылаться на this (вне функции), который является экземпляром MyType.

  • Если вы называете это new this.MySubType(), то это относится к новому экземпляру MySubType.

  • Если вы позвоните как this.MySubType.call(foo), this относится к foo.

Посмотрите документацию MDN, section "Function context".

0

Я не думаю, что это получает новое значение, назначенное ему внутри анонимной функции. Вы можете захотеть look this page.

  • Внутренняя функция может быть доступна только из операторы внешней функции.
  • Внутренняя функция образует замыкание: внутренняя функция может использовать аргументы и переменные внешней функции, а внешняя функция не может использовать аргументы и переменные внутренней функции.

Мое предположение было бы, что это должно быть изнутри, доступной внутренней функция и как таковые не будет перезаписаны.

Редактировать: Я не видел комментариев при наборе текста, Феликс Клинг объясняет это гораздо лучше в своем комментарии.

+0

Спасибо за вашу помощь. – Virus721

Смежные вопросы