Re: [問題] Node.js幫JavaScript搞出繼承的問題
看板Web_Design作者hijkxyzuw (i,j,k) ×(x,y,z)時間7年前 (2017/09/05 12:19)推噓5(5推 0噓 19→)留言24則, 5人參與討論串2/3 (看更多)
比較好奇那個 enumerable 是怎麼運作的。
如果手動設置 Parent.prototype.a = 'b' ,
那所有實例的 .a 屬性都會是 enumerable ;
但這和用 Object.create 的結果不一樣。
Object.create 會把繼承來的屬性設為 no enumerable ,
如果用自己實現的 cretae 函數也是:
function myCreate(parent) {
function F() {}
F.prototype = parent
return new F()
}
或是把 function 的 prototype 換掉:
function myClass() {}
myClass.prototype = {
say: function () { console.log('hey') },
foo: 'bar',
constructor: myClass
}
好像只有當原型鏈是指向的是 function 自帶的 prototype 時,
enumerable 才會作用,不知道為什麼規格要這樣定。
我本來以為 enumerable 是在定義屬性時就跟著的,
可是 Object.create 後會一律把來自原型鏈的都設為 no enumerable 。
用 hasOwnProperty 看,這些屬性不是在實例上,
但原型的 enumerable 還是 true ……。
總覺得很奇怪。
--
+------+
| 胡 | 不要因為偉人的照片。
| |
| 適 | 就輕易相信文字內容。
+------+
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.102.187
※ 文章網址: https://www.ptt.cc/bbs/Web_Design/M.1504585191.A.AE9.html
推
09/06 18:45, , 1F
09/06 18:45, 1F
→
09/06 18:45, , 2F
09/06 18:45, 2F
→
09/06 18:46, , 3F
09/06 18:46, 3F
→
09/06 18:48, , 4F
09/06 18:48, 4F
→
09/06 18:49, , 5F
09/06 18:49, 5F
→
09/06 18:49, , 6F
09/06 18:49, 6F
→
09/06 18:50, , 7F
09/06 18:50, 7F
javascript 有繼承啊,
Object.create 就是 js 的繼承。
只是和 new 不相容ㄎㄎ
可以看這篇:
https://segmentfault.com/a/1190000002596600
看完我就大概知道 js 的繼承在幹麻了,
事後要用 new 或 Object.create 就看個人吧。
※ 編輯: hijkxyzuw (140.116.102.187), 09/06/2017 20:10:21
→
09/06 22:49, , 8F
09/06 22:49, 8F
→
09/06 22:51, , 9F
09/06 22:51, 9F
等等,我錯了,好像會影響,
那這篇就沒什麼意義了,
除了文末的推薦文章真得不錯外。
※ 編輯: hijkxyzuw (140.116.102.187), 09/07/2017 23:54:47
上面貼的那篇延伸閱讀,主要是介紹另一種不使用 new ,
純使用 Object.create 實作的繼承模型。
不使用 new 的原因是 new 是一個「關鍵字」,
和 javascript 的函數式風格不合;
例如你無法為 new apply 參數:
new MyClass.apply(null, [a,b,c]) // error
另外 new 讓 javascript 看起來像是用了 java 的繼承模型,
但當你要用到「更進階」的功能,
實作起來相當詭異,完全不像 java 。
像 this 綁定問題,繼承問題:
function Parent() {}
function Child() {}
Child.prototype = new Parent() // 這樣繼承
// 用 Object.create 會好看一點,也沒有副作用;
// 如果怕呼叫了 Parent 產生的的物件會不乾淨的話。
Child.prototype = Object.create(Parent.prototype)
// 但不管怎麼做,事後都要再手動修正 constructor
Child.prototype.constructor = Child
這種繼承怎麼看都很詭異,
所以原作者才會鼓吹另一種繼承。
至於和 new 之間是可以轉換的,
js 是個函數式的語言,超級彈性,
應該沒有不能轉的。
只是,就 new 或 Object.create 挑一種做吧,
成果的是類似的,挑一種喜歡的手段即可。
※ 編輯: hijkxyzuw (140.116.102.187), 09/08/2017 00:24:36
推
09/08 02:16, , 10F
09/08 02:16, 10F
→
09/08 02:16, , 11F
09/08 02:16, 11F
推
09/08 02:19, , 12F
09/08 02:19, 12F
一直沒有細讀 ... 算符,只記得功能很多。
反正作者最主要的目的就是把 new 去掉,
因為 new 很奇怪,和 javascript 的其它部份格格不入。
→
09/08 20:00, , 13F
09/08 20:00, 13F
→
09/08 20:00, , 14F
09/08 20:00, 14F
→
09/08 20:00, , 15F
09/08 20:00, 15F
→
09/08 20:01, , 16F
09/08 20:01, 16F
→
09/08 20:02, , 17F
09/08 20:02, 17F
→
09/08 20:02, , 18F
09/08 20:02, 18F
→
09/08 20:06, , 19F
09/08 20:06, 19F
這裡不能發文嗎???
javascript 是蠻鳥的沒錯 zzz
變數 scope 、繼承、 == 算符,
很多東西都設計的不好。
目前在讀 sicp ,
希望可以跳到 lisp 系語言,
就幾乎一切都是函數了。
※ 編輯: hijkxyzuw (140.116.102.187), 09/09/2017 20:32:47
推
09/10 09:27, , 20F
09/10 09:27, 20F
→
09/10 09:28, , 21F
09/10 09:28, 21F
→
09/10 09:28, , 22F
09/10 09:28, 22F
推
09/10 09:40, , 23F
09/10 09:40, 23F
→
09/10 09:40, , 24F
09/10 09:40, 24F
其實我蠻喜歡 js 的, node.js 也學了一點。
※ 編輯: hijkxyzuw (140.116.102.187), 09/10/2017 14:26:07
討論串 (同標題文章)
完整討論串 (本文為第 2 之 3 篇):
Web_Design 近期熱門文章
PTT數位生活區 即時熱門文章