Оператор this
возвращает ссылку на объект, являющийся текущим контекстом вызова. Это позволяет обращаться к свойствам "текущего" объекта: this.property
.
Текущий объект не является жестко фиксированным и зависит от контекста вызова функции. Он является, своего рода, скрытым параметром.
Есть четыре различных варианта его передачи.
неявно, через вызов метода |
object.method(...) |
object |
явно, через call |
function.call(object,...) |
object |
явно, через apply |
function.apply(object,...) |
object |
неявно, через вызов new |
new constructor(...) |
новый, создаваемый объект |
Если ни один из этих способов не задействован, то this
указывает на глобальный объект: в браузере это window.
Это происходит при вызове функции без объекта: myFunc(params)
.
При манипуляциях с DOM при помощи javascript, this
обычно используется для работы с событиями. При этом значение this
указывает на текущий DOM-элемент, в контексте которого вызван обработчик.
Привязка методов
Так как this
не привязано жестко к объекту, то можно привязывать один и тот же метод к любым классам.
walk = function() { this.isWalking = true }
function Bird() { /*...*/ }
function Rabbit() { /*...*/ }
Bird.prototype.walk = Rabbit.prototype.walk = walk
new Bird().walk() // в обоих случаях
new Rabbit().walk() // this будет указывать на текущий объект
Здравствуйте, А как быть с многоуровневыми объектами?
Точнее: как получить доступ к старшему объекту?
Допустим:
Если ничего не путаю, необходимо будет обращаться напрямую. чтобы получить subO в f, необходимо обращаться как o.subO, и так далее.
Помогите, пожалуйста. Весь вечер голову ломаю.
function Round(px, py, pR) {
this.x=px;
this.y=py;
this.R=pR;
this.getLength=mGetLength();
}
function mGetLength() {
return this.x;
}
var d=new Round(1, 2, 3);
var f=d.getLength;
Почему возвращает undefined?
если написАть var f=d.x; или var f=d.y; то их возвращает, а вот метод getLength не реализуется почему то
мне кажется, что ошибка здесь:
"function mGetLength() {
return this.x;
}"
думаю, в данном случае не "Round" выступает в качестве объекта, а "mGetLength".. а у mGetLength параметра "х" нету, поэтому и "undefined".
И вообще странная функция какая-то.. у тебя же уже есть параметр "х", для чего длину добавлять отдельно, да еще и функцией? О_о или я не правильно понял что?
Если кому-то еще интересно, то ошибки две:
this.getLength=mGetLength;
скобки не нужны, если мы хотим, чтоб getLength была не переменной, а методом.
А вот при вызове метода наоборот нужны скобки:
var f=d.getLength();
Там return this.x для примера только, там мат. действие в оригинале должно быть, умножение this.x, this.y и this.pR, к примеру, это я пока для примера поставил, пока разбирался)
"думаю, в данном случае не "Round" выступает в качестве объекта, а "mGetLength".. а у mGetLength параметра "х" нету, поэтому и "undefined"."
Я тоже так думал, кстати, но у меня книга есть, оттуда пример, там так написАно 0_о
А как сделать, чтоб mGetLength обращался за переменной в Round?
Только не сильно меняя код, я именно с назначением методов пытаюсь разобраться
Попробуй перед функцией this.getLength=mGetLength();
поставить строку
that = this;
и внутри функции mGetLength() использовать that вместо this.
Чем равен this внутри eval() ?
что вернет eval() ? 1 или 0 ?
Доброго времени суток, созрел вопрос. Вот почему this может затеряться при, например, присваивании функции, в которой он прописан, какому-либо другому выражению или переменной? Например:
Извините, небольшая поправка:
встречный вопрос, который даст понимание что такое this в яваскрипт...
А в чем разница между методом и функцией?...
Правильно, методы у объектов, и вызов выглядит как obj.go(), т.е. перед go стоит объект. А в вашем примере, какой объект? Вы метод превратили в обычную функцию и выполнили ее.
грубо говоря - this ссылается на тот объект, который стоит перед методом (кроме apply/call), если объекта нет - это функция.