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这样欺骗大家这样对吗????
作者:
ssccg (23)
2017-09-03 06:16:00看不懂你在写什么,prototype的继承方式本来就是自己的prototype找不到就去找prototype的prototype啊ChildObject的prototype本来就不会有hit
ChildObject.prototype没有Hit 怎么new出来的实例都能呼叫hit? prototype里面不就是放共享的属性和方法既然没有共享的属性和方法 但是实例都能呼叫hit()不是很奇怪吗? 我的意思是这样
作者:
jmlntw (吉米林)
2017-09-03 07:55:00直接用 ES6 的 class extends 了啦。util.inherits 已经过时了。单纯回答这问题,因为 inherits 会设定 enumerable:false
作者:
ssccg (23)
2017-09-03 15:15:00class extends只是语法糖,做的事情基本上是一样的prototype的继承方式是: 你在呼叫 obj.hit()时,会先在obj中找有没有hit属性,没有再找ChildObject.prototype的属性(ChildObject继承BaseObject其实是ChildObject.prototype是个BaseObject的实例),还是找不到再找他的prototype也就是BaseObject.prototype,然后就找到hit来呼叫(如果一直往上找到Object.prototype还没有才是真的没有)所以ChildObject.prototype里没有hit,实例还是能呼叫hit你先了prototype却没学到prototype chain?学
对 我只知道prototype怎么用 还有是因为是要省内存不用每个实例都有自己的方法 有相同的方法共用就好共用的方法就放进prototype里
作者:
LPH66 (-6.2598534e+18f)
2017-09-04 00:31:00然后 enumable:false 的意思是一般循环是看不到它的(这里尤其是指像 for(var s in obj) 这种 for)因此在平常印出这个物件时它就不会印出来