继承
概念:通过一个类,创建另一个类这样新创建出来的类不仅拥有了原来的属性和方法,而且还可以添加自己独有的属性和方法。实现自定义类的继承 (call)借用构造函数。。
call和apply是function的原型方法。可以用来调用函数他们的第一个参数表示被调函数内部的this指针的指向对象,剩下的参数则是为函数的实参。
apply函数的第二个参数是一个数组。数组表示的实参。
call 调用函数的执行。
通过call函数调用父类函数, 第一个参数是用来修改父类函数中this的指向,把this对象传递进去并执行父类函数,则父类函数中的属性及方法 子类可以继承。
子类不仅可以继承父类的属性和方法。还可以更改属性和方法。
<script type="text/javascript">
function hello(name,age){
console.log("hello"+name);
console.log(age)
}
// hello("张三");// 传统的调用方式、
hello.call("","许三多",12); //call 可以执行函数。
//第一个参数:内部this的指向。
//第二个参数:实参
//apply 可以执行函数
hello.apply("",["许三多",12]);
//第一个参数:内部this的指向
//数组中的值:实参
</script>
通过call实现 继承的代码:
<script type="text/javascript">
function Animal(name,age) {
this.name = name;
this.age = age;
this.eat1 = function(){
console.log("what eat?")
}
}
function Dog(name,age,leg){ //设置形参 接受实参
Animal.call(this,name,age);//继承了Animal的属性及方法。
this.leg = leg;
this.eat1 = function(){
console.log("喜欢吃骨头");
}
this.lookdoor=function(){
console.log("看门狗");
}
}
var one = new Dog("小黑",3,4);
console.log("我家的小狗叫:"+one.name+",今年"+one.age+"岁。有"+one.leg+"条腿。");
one.eat1(); //修改后的方法 喜欢吃骨头
one.lookdoor(); //看门狗
</script>```
组合继承的实现思路:使用call来继承实例属性,使用原型链来继承原型方法
组合继承(包括call和原型链的继承方式):
<script type="text/javascript">
function Animal(name,age) {
this.name = name;
this.age = age;
this.eat1 = function(){
console.log("what eat?")
}
}
Animal.prototype.gender ="男";
Animal.prototype.haha = function(){
console.log("haha");
}
function Dog(name,age,leg){
//使用call来继承实例属性
Animal.call(this,name,age);
this.leg = leg;
this.lookdoor=function(){
console.log("看门狗");
}
}
//使用原型链继承原型方法。
Dog.prototype = new Animal(); //Dog的原型指向Animal;继承了父类。
Dog.prototype.constructor = Dog;//让子类的原型指向子类的构造函数 修正了继承关系
var one = new Dog("小黑",23,4);
var two = new Dog("小白",23,3);
console.log(one.name);
console.log(two.name)
one.eat1();
console.log(one.gender);//原型的链
one.haha();
console.log(one.constructor == Dog)//测试实例对象是是否是子类构造函数所创建的
</script>```
通过冒充实现继承:
<script type="text/javascript">
//冒充继承
//注:不能继承父类的原型对象及方法
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.gender = "男";
Person.prototype.run = function(){
console.log("快走")
}
function Student(name,age,hobby){
//通过冒充实现子类继承父类的方法和属性
this.newFn = Person; //给this添加一个新的函数 也就是父类
this.newFn(name,age ); //执行新添加进去的函数,通过this.newFn调用父类,进而修改了父类中的this的指向
delete this.newFn; // 修改完指针的指向后可以把新添加的方法删掉
//继续添加新的属性和方法
this.hobby = hobby;
this.study = function(){
console.log("学习");
}
}
var one = new Student("张三",21,"篮球");
console.log(one.name+";"+one.age+";"+one.hobby);
one.study();
</script>```
网友评论