Обозначение литерального объекта Javascript против имени объекта - PullRequest
2 голосов
/ 01 февраля 2012

У меня есть такой литерал объекта:

var test = {
    one: function() {
    },
    two: function() {
        this.one(); // call 1
        test.one(); // call 2
    }
};

В чем разница между вызовами в функции two (использование имени литерала объекта по сравнению с использованием this)?

Ответы [ 2 ]

5 голосов
/ 01 февраля 2012

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

test.two(); // inside, "this" refers to the object "test"

Вы можете изменить значение this, используя Function.prototype.call:

test.two.call(bar); // inside, "this" refers to the object "bar"

Но значение test остается неизменным внутри функции two, независимо от того, как вызывается функция.

1 голос
/ 01 февраля 2012

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

var other = {
    one: function () {
        alert('other.one');
    }
};

// call test.two as a method of object other
test.two.call(other); // calls other.one and test.one
...