Re: [問題] Node.js幫JavaScript搞出繼承的問題

作者: hijkxyzuw (i,j,k) ×(x,y,z)   2017-09-05 12:19:49
比較好奇那個 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 ……。
總覺得很奇怪。
作者: nnlisalive (nnlisalive)   2017-09-06 18:45:00
我已經放棄思考了 反正這都是node.js設計者的邏輯可能他們認為不這樣做 會碰到一些XXOO的問題知道輸入啥程式碼 瀏覽器會正常執行就好 >_<我是看書上寫說javascript沒有繼承 所以node.js才用prototype的概念弄出繼承 但既然繼承很重要 為啥不直接把繼承這個東西 放進JavaScript語法裡?C/C++好像都有繼承 JavaScript學他們就好啦
作者: bibo9901 (function(){})()   2017-09-06 22:49:00
參考lua的metatable就可以知道js的prototype的設計很差prototype, [[prototype]], __proto__ 非常累贅的
作者: eight0 (欸XD)   2017-09-08 02:16:00
那篇文章寫於 2013/5/26,作者重造了整個繼承系統,在那時也許是有好處的,但現在用 class 比較好另外要展開陣列︰new MyClass(...[a,b,c])
作者: reinforce15   2017-09-08 20:00:00
"這種繼承怎麼看都很詭異" 這句有點怪怪的, 有想過javascript是直譯語言嗎, 既然是直譯語言又要再browser上跑,直譯器當然是越輕薄越好,語法越少越好,別忘了,當初javascript可是Bredan老兄趕鴨子上架出來的東西,語言本身上自然會有缺點,有興趣可以查一下ECMAScript我竟然會在這裡發文... 算了當我上面什麼都沒說 沒說
作者: Neisseria (Neisseria)   2017-09-10 09:27:00
JavaScript 是目前前端必備的技術,一時間不會被取代先前 Google 推 Dart,想取代 JavaScript 就失敗了除了寫前端,完全不會想碰這個語言真的要寫 JavaScript 物件,用 TypeScript 或 Babel寫好再轉程式碼就好,自己手動寫反而費工

Links booklink

Contact Us: admin [ a t ] ucptt.com