推 nnlisalive: 我已經放棄思考了 反正這都是node.js設計者的邏輯 09/06 18:45
→ nnlisalive: 可能他們認為不這樣做 會碰到一些XXOO的問題 09/06 18:45
→ nnlisalive: 知道輸入啥程式碼 瀏覽器會正常執行就好 >_< 09/06 18:46
→ nnlisalive: 我是看書上寫說javascript沒有繼承 所以node.js才用 09/06 18:48
→ nnlisalive: prototype的概念弄出繼承 但既然繼承很重要 為啥不直 09/06 18:49
→ nnlisalive: 接把繼承這個東西 放進JavaScript語法裡? 09/06 18:49
→ nnlisalive: C/C++好像都有繼承 JavaScript學他們就好啦 09/06 18:50
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
→ bibo9901: 參考lua的metatable就可以知道js的prototype的設計很差 09/06 22:49
→ bibo9901: prototype, [[prototype]], __proto__ 非常累贅的 09/06 22:51
等等,我錯了,好像會影響,
那這篇就沒什麼意義了,
除了文末的推薦文章真得不錯外。
※ 編輯: 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
推 eight0: 那篇文章寫於 2013/5/26,作者重造了整個繼承系統,在那時 09/08 02:16
→ eight0: 也許是有好處的,但現在用 class 比較好 09/08 02:16
推 eight0: 另外要展開陣列︰new MyClass(...[a,b,c]) 09/08 02:19
一直沒有細讀 ... 算符,只記得功能很多。
反正作者最主要的目的就是把 new 去掉,
因為 new 很奇怪,和 javascript 的其它部份格格不入。
→ reinforce15: "這種繼承怎麼看都很詭異" 這句有點怪怪的, 有想過 09/08 20:00
→ reinforce15: javascript是直譯語言嗎, 既然是直譯語言又要再 09/08 20:00
→ reinforce15: browser上跑,直譯器當然是越輕薄越好,語法越少越好, 09/08 20:00
→ reinforce15: 別忘了,當初javascript可是Bredan老兄趕鴨子上架出 09/08 20:01
→ reinforce15: 來的東西,語言本身上自然會有缺點,有興趣可以查一下 09/08 20:02
→ reinforce15: ECMAScript 09/08 20:02
→ reinforce15: 我竟然會在這裡發文... 算了當我上面什麼都沒說 沒說 09/08 20:06
這裡不能發文嗎???
javascript 是蠻鳥的沒錯 zzz
變數 scope 、繼承、 == 算符,
很多東西都設計的不好。
目前在讀 sicp ,
希望可以跳到 lisp 系語言,
就幾乎一切都是函數了。
※ 編輯: hijkxyzuw (140.116.102.187), 09/09/2017 20:32:47
推 Neisseria: JavaScript 是目前前端必備的技術,一時間不會被取代 09/10 09:27
→ Neisseria: 先前 Google 推 Dart,想取代 JavaScript 就失敗了 09/10 09:28
→ Neisseria: 除了寫前端,完全不會想碰這個語言 09/10 09:28
推 Neisseria: 真的要寫 JavaScript 物件,用 TypeScript 或 Babel 09/10 09:40
→ Neisseria: 寫好再轉程式碼就好,自己手動寫反而費工 09/10 09:40
其實我蠻喜歡 js 的, node.js 也學了一點。
※ 編輯: hijkxyzuw (140.116.102.187), 09/10/2017 14:26:07