js之继承

js继承概念

js里常用的如下两种继承方式:
1.通过原型链方式实现继承(对象间的继承)
2. 类式继承(构造函数间的继承)

原型链

构造函数、原型、实例的关系:
每个构造函数都有一个原型对象(prototype),原型对象都包含一个指向构造函数的指针(constructor),
而实例都包含一个指向原型对象的内部指针(__proto__)。

(每个对象都有一个内部属性__proto__属性,属性的值可以是一个对象,也可以是null.如果它的值是一个对象,则这个对象也一定有自己的原型.
这样就形成了一条线性的链,我们称之为原型链)

原型链继承

例子:
 function Parent() {
            this.hobby="play";
        }
        Parent.prototype.showHobby=function () {
            return this.hobby;
        }
        function Son() {
            this.sonhobby="eat";
        }
        //实现继承  ,继承Parent
        Son.prototype=new Parent();
        Son.prototype.showSonhobby=function () {
            return this.sonhobby;
        }
        var obj=new Son();
        alert(obj.showHobby())
        for(var i in obj){
            document.write(i+"---"+obj[i]+"<br>");
        }

原型链继承关系图

在这里插入图片描述

构造函数继承

function a(name,age){
			this.name=name;
			this.age=age;
			this.arr=['大哥','大姐','小姐姐'];
		}
		a.prototype.fun=function(){
			alert(this.name+this.age)
		}
		function b(name,age){
			a.call(this,name,age)
		}
		var b1=new b('jcak','12');
		var b3=new b('tom','122');
		var b2=new a();
//		alert(b1.name)//jack
//		alert(b2.name)//undefined
//		alert(b3.name)//tom
//		alert(b2.arr);//大哥,大姐,小姐姐
//		alert(b1.arr);//大哥,大姐,小姐姐
//		b1.arr.push('小哥哥');
//		alert(b2.arr);//大哥,大姐,小姐姐
//		alert(b1.arr);//大哥,大姐,小姐姐,小哥哥
		b1.fun()



//		var o={
//			x:4
//		}
//		var x=12;
//		function a(){
//			alert(this.x)//12  4
//		}
		window.a();
//		a.call(o)//o对象通过call方法冒充a来执行a里面的输出方法

组合继承

function a(name,age){
			this.name=name;
			this.age=age;
			this.arr=['哈哈','呵呵']
		}
		function b(name,age){
			a.call(this,name,age)
		}
		a.prototype.fun=function(){
			alert(this.name+this.age)
		}
		b.prototype=new a();
		var c1=new b('tom','12')
		var c2=new b('jack','122')
//		alert(c1.name)
//		alert(c2.name)
//		c1.fun();
//		c2.fun();
		alert(c1.arr)//哈哈,呵呵
		alert(c2.arr)//哈哈,呵呵
		c1.arr.push('嘿嘿')
		alert(c1.arr)哈哈,呵呵,嘿嘿
		alert(c2.arr)//哈哈,呵呵

总结

1:什么是继承,继承的概念:
	继承是指一个对象直接使用另一对象的属性和方法,继承可以使得子类具有父类的各种属性和方法。
2:继承的称呼:
	父类 == 超类型 == 基类
	子类 == 派生类
3:继承的方法:
	1:原型链继承
		原型链继承的缺点:
			1:创建子类实例时不能向超类传参
			2:引用类型不能保持独立
	2:构造继承
		借用构造函数的继承解决了:
			1:引用保持独立
			2:可以传参
			借用构造函数的继承(又叫:冒充继承)
			方法:call()
			构造继承缺点:
			对象冒充只能继承构造实例中的属性和方法,不能继承原型中的属性和方法!
	3:原型+构造继承(组合继承)
			组合继承就是   原型继承+构造继承
			原型链继承  只继承原型里面的内容
			构造函数(冒充继承)只继承构造函数里面的内容
			
			组合继承解决了  想共享的共享  不想共享的不共享问题
	
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页