Web_Design 板


LINE

大家好最近在唸vue 相信關於為什麼data要使用function已經被討論到爛掉 看了很多講解都是下面的例子 const MyComponent = function() {}; MyComponent.prototype.data ={ a: 1, b: 2, }; const component1 = new MyComponent(); const component2 = new MyComponent(); component1.data.b = 5; console.log(component2.data) ↑因為會共享同一個reference ----------------------------------- 所以應該改成以下function的方式: const MyComponent = function() { this.data = this.data(); }; MyComponent.prototype.data = ()=> { return{ a: 1, b: 2 } }; const component1 = new MyComponent(); const component2 = new MyComponent(); component1.data.b = 5; console.log(component2.data) 但我不太明白的是這個講解,跟是不是function的影響有什麼關係? 因為這邊如果一開始就將data的資料放在constructor裡 像是 const MyComponent = function() { this.data = { a:1, b:2 } }; 每次實例化時就會初始化,所以只要把data放在constructor裡 本來就可以解決問題了,跟是不是function有什麼關係? -------------------------------------------------- 以下為調整過後的範例,對於我自己有比較想通了 希望有助於跟我有一樣有相同問題的人幫助理解 -------------------------------------------------- const MyComponent = function() { this.data = this.data; //Object表示 //this.data = this.data(); //function表示 }; //Object表示 MyComponent.prototype.data ={ a: 1, b: 2 }; // //function表示 // MyComponent.prototype.data = ()=>{ // return{ // a:1, // b:2 // } // } const component1 = new MyComponent(); const component2 = new MyComponent(); component1.data.b = 5; console.log(component2.data) 上面的範例調整了不論使用object或是function的方式 統一條件this.data都放在constructor裡 且也統一調整了獲取的方式都從prototype中拿取 這樣就能單純比較使用object跟使用function的差異 當初卡住的理由是this.data = this.data這行其實就等於原範例中 不寫在constructor的原因,理由是寫與不寫都是從prototype中拿取 當時沒想到這點,所以卡了很久 感謝各位大大! --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 115.43.135.34 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Web_Design/M.1688885096.A.532.html
1F:推 cloki: 你的data不會永遠只用{a:1,b:2},要用別的就會把data拆出來 07/09 21:25
不好意思不太明白,請問這有範例可以呈現嗎?
2F:→ cloki: 如果只用object的話你直接改就會動讓每個實體的data都變成 07/09 21:26
3F:→ cloki: 5,如果用callback的話才會讓this.data每次都是新的預設值 07/09 21:26
※ 編輯: heavenbetula (115.43.135.34 臺灣), 07/09/2023 23:18:56
4F:→ ck574b027: 你的舉例是一樣意思,constructor也是function。不要 07/10 08:02
5F:→ ck574b027: 在js使用prototype,語意會讓你誤會很多東西。 07/10 08:02
6F:→ ssccg: function隨時可呼叫,為什麼你會覺得constructor有比較好? 07/10 10:04
7F:→ ssccg: data又不一定要是在new Component的時候呼叫,獨立的functi 07/10 10:12
8F:→ ssccg: on之後如果需要取回data預設值,隨時都能呼叫data() 07/10 10:13
9F:→ ssccg: 怎麼會沒事想去選個最沒彈性的寫法 07/10 10:14
感覺好像偏離了問題 我的疑問不是說哪個方法好 我也沒說constructor比較好 而是想釐清 網路上的解釋是說在constructor中使用了this.data = this.data() 但似乎跟vue為什麼data用function的原因無關? ※ 編輯: heavenbetula (115.43.135.34 臺灣), 07/11/2023 21:18:18
10F:→ cloki: 因為在設計的概念上就不想直接把data的內容寫進去啊 07/12 16:56
11F:→ cloki: 然後那個例子就告訴你不用function的話就會把原型內的值一 07/12 16:58
12F:→ cloki: 併改掉,所以不能用object應該用function,沒弄清楚的話先把 07/12 16:59
13F:→ cloki: 例如裡面的值都print出來比較一下 07/12 16:59
14F:推 microloft: 沒有,原po最後一段用obj的寫法就已經不會共用ref了 07/12 18:06
15F:→ microloft: 所以用func並不是必要,只是一種寫法選擇 07/12 18:07
m大說的對,所以我才會想說為什麼網路上一堆解釋都是用這個範例 ※ 編輯: heavenbetula (115.43.135.34 臺灣), 07/14/2023 21:48:50
16F:→ cloki: 感謝m大 原來我理解是錯的 那分別就只是那是沒有es6的寫法? 07/15 01:50
17F:推 microloft: 如果我沒弄錯,那寫法/機制應該上古時期就有了, 07/15 02:47
18F:→ microloft: ES6只多加入了更直觀的class宣告語法。 07/15 02:47
19F:→ microloft: 所以多套一層func除了上面提到的回復預設值外, 07/15 02:48
20F:→ microloft: 老實說我也想不到還有什麼其他好處... 07/15 02:49
21F:→ ck574b027: 不會共用的原因是因為用了function,只是前者叫data() 07/16 10:55
22F:→ ck574b027: 後者是constructor,不要誤導人 07/16 10:56
23F:→ ck574b027: 為何要用前者當範例,因為是好習慣 07/16 11:11
24F:→ ck574b027: 與其糾結這個不如去看vue3 07/16 11:12
25F:推 microloft: 並不是,原po共列了3種寫法,1會共用,2跟3不會。 07/16 17:26
26F:→ microloft: 根本的差別是1直接操作原型鍊物件的data的屬性, 07/16 17:26
27F:→ microloft: 2跟3則寫在建構子裡,在初始化時會另生一份。 07/16 17:26
28F:→ microloft: 所以賦值給data時是用func(2)還是物件(3)並不是 07/16 17:26
29F:→ microloft: 是否會共用的原因。 07/16 17:26
30F:→ microloft: 範例2裡的data()從來就沒有扮演建構子的角色 07/16 17:30
31F:→ microloft: 1~3的建構子都同樣是MyComponent 07/16 17:32
32F:→ ck574b027: 這樣講沒有觸碰到本質,物件(3)不會共用是因為他的位置 07/19 00:18
33F:→ ck574b027: 在建構子。偷用了正確方式來說他是對的根本狐假虎威 07/19 00:20
34F:→ ck574b027: 把範例的建構子拿掉,在new之後才賦值給data比較清楚 07/19 00:22
35F:→ ck574b027: (2) component1.data = init() 07/19 00:24
36F:→ ck574b027: (3) component1.data = {...} 07/19 00:24
37F:→ ck574b027: 說func不是必要,結果利用的建構子還是func,你紹安嗎 07/19 00:30
38F:推 microloft: 麻煩你看清楚,原po這篇本來就是在問為什麼都移到建構 07/19 01:55
39F:→ microloft: 子裡了還要多用data()這個func,前面有人說是因為共用 07/19 01:56
40F:→ microloft: 問題,我才會回覆說func並不是必要,因為根本的原因不 07/19 01:56
41F:→ microloft: 在那裡 07/19 01:56
42F:→ microloft: 另外你提到的「本質」我前面明明就講過一樣的了... 07/19 02:09
43F:→ ssccg: 我覺得是原PO死讀書,雖然教學說data用function是避免重複 07/21 10:18
44F:→ ssccg: 用到同一個物件,但那就不是唯一的原因啊,本來就有很多方 07/21 10:20
45F:→ ssccg: 法達成這個效果,我相信寫講解的人也只是要表示「有這個效 07/21 10:21
46F:→ ssccg: 果是設計目標之一」而不是「只有這個設計能達這效果」 07/21 10:22
47F:→ ssccg: 甚至就放prototype但新建Component時固定做deep clone也行 07/21 10:25
48F:→ ssccg: 啊,不用獨立function也不用constructor啊 07/21 10:27
49F:→ ssccg: 用function只是充分條件,但原PO似乎堅持一定要充要條件(只 07/21 10:28
50F:→ ssccg: 有用function才能達成這效果)才叫做「有關」,只要有其他實 07/21 10:29
51F:→ ssccg: 作就叫無關,莫名奇妙死腦筋 07/21 10:29
我知道有許多方法啊 但我就是其中一點不明白才會只針對這一點詢問 假如我是一個程式小白,我對for迴圈不明白 難道你跟我講解多個迴圈方式 會對我針對for迴圈不明白這件事有幫助嗎 所以我才會說這偏離的問題
52F:→ ssccg: 現實就是很多方法,再用別的條件來挑哪個方法好(或比較不壞 07/21 10:30
53F:→ ssccg: )但原PO埾持這叫做偏離問題,那就自己去想再久也想不通吧 07/21 10:30
54F:→ ssccg: 為什麼網路上一堆解釋都是用這個範例,講白一點就是覺得對 07/21 10:30
55F:→ ssccg: 新手不用講這麼多啦,啊對老手自然會自己想通才不會這樣卡 07/21 10:31
56F:→ ssccg: 住腦子轉不動 07/21 10:31
57F:→ ssccg: 要講其他考量那可多了,constructor最不好的就是呼叫時機很 07/21 10:36
58F:→ ssccg: 死一定在最前面啊,如果想把Component建立和data初始化中間 07/21 10:37
59F:→ ssccg: 切個階段出來就不行了。另外像用function而不用clone的理由 07/21 10:39
60F:→ ssccg: 顯然是function內容是呼叫時執行,而不像物件早就填進去了 07/21 10:46
首先我想澄清一下,如果我只是死讀書,我大可背下這個解法就好 我又何必去追問這個的原因是為什麼 這邊每個大大來回答解惑我都很感激 但不表示我不能表達我覺得有疑問的地方 其實這一版看多了許多發問的問題 往往都會被洗臉甚至被認為這種問題沒什麼好問 只希望大家都可以將心比心 想想每個人都有新手的時候 謝謝 ※ 編輯: heavenbetula (115.43.135.34 臺灣), 07/22/2023 13:00:11 ※ 編輯: heavenbetula (115.43.135.34 臺灣), 07/22/2023 14:18:25 ※ 編輯: heavenbetula (115.43.135.34 臺灣), 07/22/2023 14:22:02 ※ 編輯: heavenbetula (115.43.135.34 臺灣), 07/22/2023 14:28:45







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP