- ๋ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ๋๋ ๋ฏธ๋ฆฌ data ์ต์ ์ ์ ์ธํ์ง์์ผ๋ฉด ๋์ค์ ์ถ๊ฐ๋๋ ๋ฐ์ดํฐ๋ ๋ฐ์์ฑ์ ๊ฐ์ง์ง ์๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง๋ data๊ฐ ๊ฐ์ง ์ต์ ์
vm.key
์vm.$data.key
์ ์กด์ฌํ๋ค.- ์๋๋
vm.$data.key
์ ๊ฐ์ด ์ ์ธ์ด ๋์ง๋ง this๋ฅผ ํตํด์ ์ ๊ทผ ํ ์ ์๋๋กvm.key
๋ ํ ์ ์๊ฒ ๋ง๋ค์๋ค.
(๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋๋ค ์๋ก๊ฐ์ ์ฐ๊ฒฐ๋ก ์ํฅ์ ๋ฐ๋๋ค.)
<div id="app">
<h1>{{count}}</h1>
<h2>{{double}}</h2>
</div>
</body>
<script>
const App = {
data() {
return {
count: 0
}
}
}
const vm = Vue.createApp(App).mount('#app')
</script>
๋ง๋ค์ด์ง vm์ ๊ฒฝ์ฐ data์ต์ ์ ๋ฐ๋ count๋
vm.count์๋ ์กด์ฌํ๊ณ , vm.$data.count์๋ ์กด์ฌํ๋ค.
์ฆ,๋ฐ์ํ ๋ฐ์ดํฐ ํน์ง 2,3๋ฒ์ด ์ฑ๋ฆฝํ๋ค.
์ง์
$data.double
๊ณผ double์ ๊ฐ์ ๋ฐ๊พธ์ด๋<h2>
์ ์ ์ฅํ double์ด ์ ์ฉ๋์ง ์๋ ๊ฒ์ ๋ณด๋ฉด ๋ฐ์ํ ๋ฐ์ดํฐ ํน์ง 1๋ฒ์ด ์ฑ๋ฆฝํ๋ค.
์ฆ, ๋ฑ๋ก๋์ง์๋ ๊ฒ์vm.$data.double
๊ณผvm.double
๊ฐ์ ๊ฒฐํฉ์ด ์กด์ฌํ์ง๋ ์์์๋ผ๊ณ ์๊ฐ๋ ๋ ๋ค.
(์ค์ ๋กvm.double=100
์ ํ๊ณvm.$data.double
์ ๊ด์ฐฐํ๋ฉด ์กด์ฌํ์ง์๋๋ค. )
๊ฐ์ฅ ๊ฐ๋จํ ์์๋ฅผ ๋ค์ด๋ณด์
const obj1 = {
data : {
count : 0
}
}
const obj2 = {
data() {
return {
count : 0
}
}
}
function P(data){
this.change = ()=>{
data.count += 10;
}
this.ret = () => {
return data.count;
}
}
let A = new P(obj1.data)
let B = new P(obj1.data)
let C = new P(obj2.data())
let D = new P(obj2.data())
A.change()
console.log(A.ret()) //10
console.log(B.ret()) //10
// A์ ์ํฅ์ ๋ฐ์ B๊ฐ ๋ณ๊ฒฝ
C.change()
console.log(C.ret()) //10
console.log(D.ret()) //0
// C์ ์ํฅ์ ๋ฐ์ง์์ D๋ ๋ณ๊ฒฝX
์ฆ, ๊ฐ์ฒด๋ฅผ ํตํด ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ๋์์ ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด์ ์ฐ๊ด๋ ๊ฐ ๋ํ ๋ณํ๊ฒ ๋๋ call by reference์ ์ํฅ์ ๋ฐ๋๋ค.
์ด๋ฅผ ์๋ก๊ฐ์ ์ฐ๊ด์ ์์ ๊ธฐ ์ํด์ ํด๋น return ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์์ ๋ฃ์ผ๋ฉด ๊ฐ์ด ๋ณํด๋ ๋ค๋ฅธ ๊ฐ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
function P({count}){
this.change = ()=>{
count += 10;
}
this.ret = () => {
return count;
}
}
Pํจ์๊ฐ ์ด์๊ฐ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด ๊ฐ์ ๋ฐ์๊ฒ์ด๋ call by value๋ก
์๋ก๊ฐ์ ์ํฅ์์ด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
110
100
110
100
function P(data){
this.count = data.count;
this.change = ()=>{
this.count += 10;
}
this.ret = () => {
return this.count;
}
}
Pํจ์๊ฐ ์ด์๊ฐ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด data.count๋ผ๋ value๊ฐ์ ์ฌ์ฉํ๋ฏ๋ก ์๋ก๊ฐ์ ์ํฅ์์ด ์์ ๊ฐ๋ค.
const App1 = {
data : {
count: 0
}
}
const proxyA = new Proxy(App1.data,{
get(target, key){
return target[key]
},
set(target, key, value){
target[key] = value * 2
}
})
const proxyB = new Proxy(App1.data,{
get(target, key){
return target[key]
},
set(target, key, value){
target[key] = value * 2
}
})
const App2 = {
data() {
return {count : 0}
}
}
const proxyC = new Proxy(App2.data(),{
get(target, key){
return target[key]
},
set(target, key, value){
target[key] = value * 2
}
})
const proxyD = new Proxy(App2.data(),{
get(target, key){
return target[key]
},
set(target, key, value){
target[key] = value * 2
}
})
๊ฐ์ฒด๋ฅผ ์ง์ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์๋ proxyA,proxyB๋ ์๋ก ์ํฅ์ ๋ฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋์๊ณ
returnํ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์๋ proxyC,proxyD๋ ์๋ก ์ํฅ์ ๋ฐ์ง์์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง์์๋ค.
const App = {
data() {
return {
counter: 0
}
}
}
const vm1 = Vue.createApp(App).mount('#app')
const vm2 = Vue.createApp(App).mount('#btn')
proxy์ ์ ์ฌํ Vue์์๋ ํด๋น App ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํ๊ธฐ์ํด ์ฌ์ฌ์ฉํ ๋ ์๋ก๊ฐ์ ์ํฅ์ผ๋ก ์ค๋ฅ๊ฐ ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด์
์ด์๊ฐ์ด return์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐ์์ฃผ๋ ๊ฒ์ ์ ์ ์๋ค.
์ฐ๋ฆฌ๋ ์ด๋ ํ ๊ฐ์ ๋ฐ์ ๋ ๊ทธ ๊ฐ์ด ์์ํ์ธ์ง ์ฐธ์กฐํ์ธ์ง์ ๋ฐ๋ผ
ํด๋น ๊ฐ(์์ํ/์ฐธ์กฐํ)์ ๋ณ๊ฒฝํ์์ ๋
์ด๊ฒ์ ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉํ ๊ณณ์์ ์ํฅ์ ๋ฐ๋๋ค๋ฉด ์ฐธ์กฐํ
๋ค๋ฅธ ๊ณณ์์ ์ํฅ์ ๋ฐ์ง ์๋๋ค๋ฉด ์์ํ์ผ๋ก ๋ณผ ์ ์๋ค.
์ด๋ ์ฐธ์กฐํ์ ์ฐ๊ธดํ๋ ์๋ก๊ฐ์ ์ํฅ์ ์ฃผ๊ณ ์ถ์ง ์๊ฒ ๋ง๋ค๋ ค๋ฉด
์ง์ ์ฐ๋๊ฒ์ด ์๋ ํจ์๋ฅผ ํตํด ๋ฆฌํดํ ์ํ์ ์ฐธ์กฐํ์ ๋ฐํํด์ ์ฌ์ฉํด์ผํ๋ค.
app.data (X) -> app.data()
์ฆ, vue์์๋ ์ฐธ์กฐํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฌ์ฉ์ ์์ด์ ํด๋น ๊ฐ๋ค์ ๋ ๋ฆฝ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ฆฌํดํ ์ํ์ ์ฐธ์กฐํ์ ๋ฐํ์ ์ด์ฉํ๋ค.