Re: [問題] ES2015的class問題

看板Ajax作者 (大嘴先生)時間10年前 (2015/10/30 10:07), 編輯推噓0(004)
留言4則, 2人參與, 最新討論串2/3 (看更多)
自問自答, 現在暫時使用getter/setter + scope變數來實作 「可在所有實例間分享」、「可繼承」的資料屬性。 "use strict"; let someHash = { a:1, b:2 }; class A { get someHash() { return someHash; } set someHash(value) { someHash = value; } } const a = new A(); const b = new A(); a.someHash.a = 2; console.log(b.someHash.a); //2 但這樣的做法會讓對實例或者繼承者實例覆寫屬性時也蓋掉所有實例的屬性 a.someHash = { c: 3 }; console.log(b.someHash.a); //undefined 要防止這點只要不設setter(讓嘗試寫入時出錯)或讓setter時不改變someHash即可, 要完整實作舊版prototype的機制大概得動用__偽private屬性 let someHash = { a:1, b:2 }; class A { get someHash() { return this.__someHash || someHash; } set someHash(value) { this.__someHash = value; } } const a = new A(); const b = new A(); a.someHash.a = 2; console.log(b.someHash.a); //2 a.someHash = { c: 3 }; console.log(a.someHash.a); //undefined console.log(a.someHash.c); //3 console.log(b.someHash.a); //2 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.75.132.13 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1446170843.A.DC8.html

10/30 11:52, , 1F
幹嘛不直接放在prototype上就好
10/30 11:52, 1F

10/30 11:57, , 2F
我上篇有說啊 node.js下的class沒有prototype讓你改
10/30 11:57, 2F

10/30 11:58, , 3F
是babel編譯時用prototype實作你才能改
10/30 11:58, 3F

10/30 17:29, , 4F
啊 我錯了 原來只是不能直接設定 但是可以加屬性
10/30 17:29, 4F
文章代碼(AID): #1MCj3Rt8 (Ajax)
文章代碼(AID): #1MCj3Rt8 (Ajax)