image.png
这里原型链继承的问题在于原型对象是浅拷贝,目前对于任意一个原型的更改,会更改两个类上的属性和方法.
解决方法:
Student.prototype = new people()
这里就相当于父类(实例化)复制了一份自己赋值给子类 拿到属性和方法 值传递.
//父类
function People(uname,age){
this.uname = uname;
this.age = age;
this.www = '30'
}
//父类方法
People.prototype.sayhi = function(){
console.log('你好');
}
//子类
function Student(uname,age,hobby){
//将父类的this实例对象(指向)更改为子类 达成连接
//接下来子类所创建的实例对象既可以访问自己的属性和方法 并且也可访问父类的属性和方法(方法需要深拷贝一下)
People.call(this,uname,age)
this.hobby = hobby;
}
//深拷贝 原型对象空间不应该互通 这里父类(实例化对象)复制了一份自己赋值给子类 子类拿到其属性和方法(值传递)
Student.prototype = new People();
//标识 标准指向的构造函数
Student.prototype.constructor = Student
//子类所创建的方法 父类的原型空间就不会有了 因为上面是深拷贝
Student.prototype.goSchool = function(){
console.log(this.uname+'去上学了');
}
console.log(new Student('小黄',20,25)); //这里打印子类不仅有自己的属性 还有父类中的www
var zi = new Student()
zi.sayhi() //子类还有父类的sayhi方法
console.log(new People());
var fu = new People() //这里父类调用不到子类的方法
// fu.goSchool();
</script>
每个构造函数中的call就相当于连接点.