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