为了账号安全,请及时绑定邮箱和手机立即绑定

抽象类中子类为什么不能调用父类的非抽象方法?

function DetectorBase() {
    throw new Error('Abstract class can not be invoked directly!');
}

DetectorBase.detect = function() {
    console.log('Detection starting...');
}
DetectorBase.stop = function() {
    console.log('Detection stopped.');
};
DetectorBase.init = function() {
    throw new Error('Error');
}

//var d = new DetectorBase();// Uncaught Error: Abstract class can not be invoked directly!

function LinkDetector() {}
LinkDetector.prototype = Object.create(DetectorBase.prototype);
LinkDetector.prototype.constructor = LinkDetector;

var l = new LinkDetector();
console.log(l); //LinkDetector {}__proto__: LinkDetector
l.detect(); //Uncaught TypeError: l.detect is not a function
l.init(); //Uncaught TypeError: l.init is not a function


主要是倒数第二行代码。为什么会报错,这里不是应该执行的吗?控制台应该输出 Detection starting... 吗?

---

我把老师的代码补全,实例化,调用了一下,为什么没有成功呢?

正在回答

4 回答

你上面给DetectorBase.detect = func.....

只是给DetectorBase这个function对象赋予了 方法,而不是给DetectorBase(或者说是子类的实例)的实例赋予了方法,如果想给实例赋予方法 必须写成 DetectorBase.prototype.detect = function......

0 回复 有任何疑惑可以回复我~
#1

再不努力就是纯屌丝 提问者

非常感谢!
2015-06-17 回复 有任何疑惑可以回复我~
#2

再不努力就是纯屌丝 提问者

那老师讲这里的时候,虽然没有深入讲完,但是他是不是代码写的不太对?
2015-06-17 回复 有任何疑惑可以回复我~
#3

Will丶Lee 回复 再不努力就是纯屌丝 提问者

嗯嗯, 是的,估计是做ppt的时候没注意到吧
2015-06-18 回复 有任何疑惑可以回复我~
#4

再不努力就是纯屌丝 提问者 回复 Will丶Lee

恩,谢谢!
2015-06-19 回复 有任何疑惑可以回复我~
查看1条回复

你上面的赋值方法,仅仅是给 DetectorBase这一个function对象添加了方法,记住 实例化 的对象 的__proto__属性是指向 所属类 的 prototype 属性,要想给所有的 实例对象添加方法,就必须给所属类的原型链添加方法

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JavaScript深入浅出
  • 参与学习       281121    人
  • 解答问题       1020    个

由浅入深学习JS语言特性,且解析JS常见误区,从入门到掌握

进入课程

抽象类中子类为什么不能调用父类的非抽象方法?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信