作者nnlisalive (nnlisalive)
看板Web_Design
标题[问题] Node.js帮JavaScript搞出继承的问题
时间Sun Sep 3 05:46:46 2017
var BaseObject=function(){};
var ChildObject=function(){}; //宣告两个原型物件
BaseObject.prototype.hit=function(){
console.log('hit()呼叫成功!');
}
//把hit函数放进BaseObject.prototype内
//所以BaseObject的实例都有hit()
const util = require('util');
util.inherits(ChildObject,BaseObject);
这是Node.js搞出来的继承函数
让ChildObject可以继承BaseObject的prototype
var obj = new ChildObject();
obj.hit(); //hit()呼叫成功
问题是我无聊看看他们的prototype内有什麽
console.log(BaseObject.prototype);
显示 BaseObject {hit:[Function]}
目前还正常 因为这就是我放的 但是!
console.log(ChildObject.prototype);
显示 ChildObject {}
没有hit函数!!!
我new ChildObject()出来的实例都能呼叫hit()
但是ChildObject.prototype里面竟然是空的
所以Node.js骗我有继承 其实根本没继承
Node.js这样欺骗大家这样对吗????
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.173.252.61
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Web_Design/M.1504388808.A.F5A.html
1F:→ ssccg: 看不懂你在写什麽,prototype的继承方式本来就是自己的 09/03 06:16
2F:→ ssccg: prototype找不到就去找prototype的prototype啊 09/03 06:17
3F:→ ssccg: ChildObject的prototype本来就不会有hit 09/03 06:17
4F:→ nnlisalive: ChildObject.prototype没有Hit 怎麽new出来的实例都能 09/03 06:35
5F:→ nnlisalive: 呼叫hit? prototype里面不就是放共享的属性和方法 09/03 06:37
6F:→ nnlisalive: 既然没有共享的属性和方法 但是实例都能呼叫hit() 09/03 06:38
7F:→ nnlisalive: 不是很奇怪吗? 我的意思是这样 09/03 06:38
8F:推 jmlntw: 直接用 ES6 的 class extends 了啦。util.inherits 已经过 09/03 07:55
9F:→ jmlntw: 时了。 09/03 07:55
10F:→ jmlntw: 单纯回答这问题,因为 inherits 会设定 enumerable:false 09/03 07:56
所以enumerable:false 造成 ChildObject.prototype 没东西
但是每一个ChildObject的实例都有hit()可以呼叫?
我还没学到 class extends 应该是说连class是啥概念都不知道XD
总之 ES6 有搞出新方法 class extends 去实现JavaScript的继承
以後都不用util.inherits了吗?
util.inherits变成是是Node.js多余的函式?
※ 编辑: nnlisalive (1.173.252.61), 09/03/2017 14:01:56
11F:→ ssccg: class extends只是语法糖,做的事情基本上是一样的 09/03 15:15
12F:→ ssccg: prototype的继承方式是: 你在呼叫 obj.hit()时,会先在obj 09/03 15:15
13F:→ ssccg: 中找有没有hit属性,没有再找ChildObject.prototype的属性 09/03 15:16
14F:→ ssccg: (ChildObject继承BaseObject其实是ChildObject.prototype是 09/03 15:17
15F:→ ssccg: 个BaseObject的实例),还是找不到再找他的prototype 09/03 15:21
16F:→ ssccg: 也就是BaseObject.prototype,然後就找到hit来呼叫 09/03 15:21
17F:→ ssccg: (如果一直往上找到Object.prototype还没有才是真的没有) 09/03 15:23
18F:→ ssccg: 所以ChildObject.prototype里没有hit,实例还是能呼叫hit 09/03 15:23
19F:→ ssccg: 你先了prototype却没学到prototype chain? 09/03 15:24
20F:→ ssccg: 学 09/03 15:25
21F:→ nnlisalive: 对 我只知道prototype怎麽用 还有是因为是要省记忆体 09/03 16:24
22F:→ nnlisalive: 不用每个实例都有自己的方法 有相同的方法共用就好 09/03 16:25
23F:→ nnlisalive: 共用的方法就放进prototype里 09/03 16:26
24F:推 LPH66: 然後 enumable:false 的意思是一般回圈是看不到它的 09/04 00:31
25F:→ LPH66: (这里尤其是指像 for(var s in obj) 这种 for) 09/04 00:32
26F:→ LPH66: 因此在平常印出这个物件时它就不会印出来 09/04 00:32