这是我近期犯的比较傻的一个错误,一定要mark一下。
以下代码段是借用父类构造函数来实现继承的一种方法,
不过在ES6已经可以使用类了,这个作为了解对阅读以前的代码还是有好处的。
代码非常简单,
1 定义一个父类构造函数,具有姓名、年龄两个属性。
2 利用原型对象定义公用方法sing。(不了解的可以看一下原型链的相关知识)
3 定义子类构造函数,并利用call继承父类特性。
4 利用父类的新实例对象赋值给子类原型对象,从而获得父类方法。
5 定义一个新子类实例对象son2,并使用父类方法sing。
然后报错了,Uncaught TypeError: son2.sing is not a function。意思说son2.sing不是一个函数,可是检查了几遍函数没写错呀。
<script>
function Father(name,age){
this.name=name;
this.age=age;
}
Father.prototype.sing = function() {
console.log("你好");
}
function son(name,age){
Father.call(this,name,age);
son.prototype=new Father();
son.prototype.constructor=son;
}
var son2= new son();
son2.sing();
</script>
但其实错误很明显,定义公用方法以及对原型对象的赋值不能放在构造函数里边,所以把子类部分的原型对象部分提出来:
function son(name,age){
Father.call(this,name,age);
}
son.prototype=new Father();
son.prototype.constructor=son;
var son2= new son();
son2.sing();
报错就解决了。
当然这个报错不一定都是这个情况。如果你的问题和我的不一样,还有几种可能:
1 函数名写错了,检查一下有没有拼写错误。
2 有重复命名的板块,系统使用了不包含这个报错函数的板块。如这位朋友:
3 变量和函数命名重复,而函数的命名优先级比变量高。
https://blog.csdn.net/weixin_40345099/article/details/82912474
4 欢迎补充