Понимание ключевого слова this в Vue

Я начал изучать VueJS с нуля. Я следую их официальному руководству. Но я застрял здесь: https://vuejs.org/v2/guide/#Handling-User-Input

В этом примере...

var app5 = new Vue({
  el: '#app-5',
  data: {
    message: 'Hello Vue.js!'
  },
  methods: {
    reverseMessage: function () {
      this.message = this.message.split('').reverse().join('')
    }
  }
})

... как получилось, что доступ к свойству message осуществляется напрямую без какой-либо ссылки на объект data? Если ключевое слово this относится к текущему экземпляру Vue, не следует ли обращаться к свойству message следующим образом: this.data.message?

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

({
  name: "John Doe",
  data: {
    message: "Hello World"
  },
  greet: function(){
    console.log("I am " + this.name);
    console.log("I have a message for you: " + this.data.message); //see here
  }
}).greet();

Вот как я получил бы доступ к свойству в ванильном javascript. Может кто-нибудь, пожалуйста, помогите мне понять, что происходит за кулисами?


person Tanmay    schedule 19.04.2017    source источник
comment
this не всегда связано лексически. Он также может быть связан с call, apply или bind, что, вероятно, и делает VueJS.   -  person 4castle    schedule 19.04.2017
comment
Объект, который вы передаете new Vue(), и объект, который он возвращает, не являются одним и тем же объектом. Вы передаете ему объект, который он использует для создания файла Vue. Частью этого процесса является предоставление свойств данных, методов, вычислений и т. д. в качестве свойств созданного объекта.   -  person Bert    schedule 19.04.2017
comment
По сути, у него есть прокси, который делает this.$data.property доступным как this.property   -  person Belmin Bedak    schedule 20.04.2017


Ответы (2)


В Vue прокси-свойства данных и методов экземпляра Vue с использованием Прокси

person Kermit    schedule 20.04.2017
comment
Это верно для Vue 3, но совершенно неверно для Vue 2. - person manniL; 10.07.2021

Прочитайте это: Параметры/Данные

Из этого мы получаем «Объект данных для экземпляра Vue. Vue рекурсивно преобразует его свойства в геттеры/сеттеры, чтобы сделать его «реактивным».» Это означает, что все в свойстве объекта data применяется непосредственно к новому Vue. Это делает эти свойства доступными на this в качестве геттеров и сеттеров.

person gforce301    schedule 19.04.2017
comment
Было бы полезно, если бы вы также включили документацию об опции методов, которая в настоящее время: Methods to be mixed into the Vue instance. You can access these methods directly on the VM instance, or use them in directive expressions. All methods will have their this context automatically bound to the Vue instance. - person jmrah; 10.02.2020
comment
Вы правы, и ваш ответ был полезен для меня. Я добавил комментарий только на тот случай, если вы захотите обновить свой ответ дополнительной информацией. Но решать вам, очевидно. - person jmrah; 11.02.2020