下面红色圈里面的话能否写在Sub构造函数里面的思考
答案:在此处是可以的,因为Sub构造函数执行定义的时候,虽然,里面会默认执行一句话,“Sub的显示原型默认指向一个Object对象,但是,此时Sub其它的语句是不会被执行的”,只有当var sub = new Sub()执行的时候,才会执行Sub里面“显示出现的话”,此时,当执行Sub.prototype.showSubProp时,此时的Sub.prototype已经指向了父类型(Suppe)的实例对象
完整代码如下所示
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>01_原型链继承</title>
</head>
<body>
<!--
方式1: 原型链继承
1. 套路
1. 定义父类型构造函数
2. 给父类型的原型添加方法
3. 定义子类型的构造函数
4. 创建父类型的对象赋值给子类型的原型
5. 将子类型原型的构造属性设置为子类型
6. 给子类型原型添加方法
7. 创建子类型的对象: 可以调用父类型的方法
2. 关键
1. 子类型的原型为父类型的一个实例对象
-->
<script type="text/javascript">
//父类型
function Supper() {
this.supProp = 'Supper property'
}
Supper.prototype.showSupperProp = function () {
console.log(this.supProp)
}
//子类型
function Sub() {
this.subProp = 'Sub property'
Sub.prototype.showSubProp = function () {
console.log(this.subProp)
}
}
let pp1 = Sub.prototype
// 子类型的原型为父类型的一个实例对象
Sub.prototype = new Supper()
// 让子类型的原型的constructor指向子类型
Sub.prototype.constructor = Sub
let pp2 = Sub.prototype
console.log("--------------------")
console.log(pp1 === pp2)
console.log(pp1)
console.log(pp2)
console.log(sub)
// Sub.prototype = null
var sub = new Sub()
console.log("*******************")
console.log(sub)
/* sub.showSupperProp()
// sub.toString()
sub.showSubProp()
console.log(sub) // Sub */
</script>
</body>
</html>
想想这里加上这句话后,为什么会报错
很简单,因为那句话就是修改了sub.prototype的指向,而且指向的是null,当执行这句话的时候var sub = new Sub(),会执行这句话
这样的话,报错是必然的
紧接着可以思考的一个问题是,如果,我们把![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/dd1a879508878ae4e716259800b7a7c7.png)
这个向Sub构造函数的原型里面添加方法的话,写在Sub构造函数里面的话,就会造成,当每一次创建一个Sub的实例的时候,会出现,都会执行这一句的,虽然从内容上不会改变Sub的原型的方法的具体的内容,但是,会影响效率
还有一个值得思考的问题是,很明显,下面的pp1和pp2是不相等的
pp1,根据程序运行执行的顺序,应该是空的object对象(其实里面含有constructor以及__proto__),pp2此时,实际上是这个![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7a8a9639ea173262aae403d8a2bfafa5.png)
此时,pp2是Sub的一个实例对象,当执行到
这句话时,此时,pp2便又多了一属性