javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承

**
javascript从入门到跑路-----小文的js学习笔记(1)---------script、alert、document。write() 和 console.log 标签

javascript从入门到跑路-----小文的js学习笔记(2)--------- 语法构成、关键字和保留字、变量

javascript从入门到跑路-----小文的js学习笔记(3)---------javascript中的几种数据类型


javascript从入门到跑路-----小文的js学习笔记目录
**

       关注我,我们一起学习进步。

1、原型链

将一个实例的属性和方法给予到另一个实例的原型上

举个栗子:这样你可以看到这两个构造函数出来 两个都是独立的
javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承_第1张图片
然后我们将其连接起来
javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承_第2张图片
执行结果:你可以看到我们打出dx 的name 属性就是 我们上面Father 的属性
javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承_第3张图片

但是它也有 缺点 :
(1)当我们创建了多个实例之后,我们一旦更改了一个实例的属性之后,那其他的实例的属性也会被修改,因为他们是共享的;
(2)当我们创建子类实例的时候,无法向父类构造函数传递参数

2、借用构造函数

相当于是复制了一份父类的属性 然后将其借用给 子类

举个栗子:
javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承_第4张图片
执行结果:这样我们的 Son 对象里 也拥有了 Father 的属性
javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承_第5张图片

      这种方式解决了上面 一旦一个 子类实例 属性更改之后,导致其他子类的属性被一起更改 的情况。
      并且该种方式,在创建子类实例时,可以向父类构造函数传递参数

缺点:

无法实现复用,每一个子类实例都有一个新的函数,如果实例对象多了,就会导致内存消耗过大。

3、组合继承

组合继承就是将 上面的两种方式结合起来 ,可以达到取长补短的效果
javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承_第6张图片
执行结果:这也是能达到 的
javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承_第7张图片
当然 既然是两种方式取长补短之后形成的 一种方式,那么它的优点具有:
(1)不存在共享属性,一个实例属性更改导致其他实例属性更改的情况。
(2)它可以传递参数
(3)方法可复用

缺点 : 子类原型上会有一份 多余的父类实例的属性

4、原型式继承

用一个函数来生出一个新的对象,相当于这个对象就是复制的上一个对象,只不过是利用函数的形式来进行复制。

举个栗子:

//我们创建一个dx对象
var dx = {
      //添加 一个 name属性和 weight 属性
			name : "老鸭子",
			weight : "50kg"
		}
		
//这个是用来生成 新对象的函数		
		function fn(cx){
			//首先里面需要一个构造函数
			function Fn(){
				
			}			
		  Fn.prototype = cx;		  
		  return new Fn();
		}
		
		var dx1 = fn(dx);
		
		alert(dx1.name);

执行结果:这样相当于你便创造出来了一个新的对象 dx1
你可以弹出它的名字 同样是“老鸭子”
javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承_第8张图片
这种方式有其优点也有其缺点

优点 : 它是从已有的对象繁衍出来的新的对象,不需要创建自定义类型
缺点: (1)因为它们是共用的一个地址,那么有一个属性改变,那么会影响所有的对象相同的属性进行改变。
            (2)无法实现代码复用,因为属性是后添加的,没用到函数封装。

5、寄生式继承

寄生式继承 首先会创建一个新的对象,然后可以为其(添加属性或方法),然后返回对象。

举个栗子:

function fn(obj){
			//这里是一个构造函数
			function Fn(){
				
			}
			Fn.prototype = obj;
			 return new Fn();
			 
		}
		//这里是寄生 生成新对象 并且为其添加新的属性和方法的地方
		function jsdx(obj){
		//js为随便命名的一个参数
			var js = fn(obj);
			//添加属性
			js.weight = "20kg"
		//返回	
			return js
		}
		//这是我们的一个对象
		function Dx(){
			this.name = "大鸭子";
		}
		//那么 新的对象 obj1 既继承了 原对象 的 name 属性 也被添加了上面的 weight 属性
		var obj1 = new jsdx(new Dx())
		
		alert(obj1.weight);

执行结果:你可以看到 弹出 weight
javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承_第9张图片

6、寄生组合式继承

寄生组合式继承就是将两种方式进行结合

举个栗子:

function fn(obj){
			
			function Fn(){
				
			}
			Fn.prototype = obj;
			 return new Fn();			 
		}
		
		function Dx(){
			this.name = "大鸭子";
			this.weight = "50kg"
		}
		
		function Dx2(){
			Dx.call(this)
		}
		
		
		var obj1 = fn(Dx.prototype0);
		obj1.constructor = Dx2;
		Dx. prototype = obj1;
		
		var obj2 = new Dx2()
		
		alert(obj2.weight);

执行结果:
javascript从入门到跑路-----小文的js学习笔记(28)--------对象继承_第10张图片
优点:修正了上面组合继承的缺点,只使用了一次构造函数
缺点:就是写着十分繁琐。

**
关注 校园君有话说 公众号 ,回复 web前端 免费领取50G 前端学习资料 一份 ,我们一起学习进步吧。
在这里插入图片描述

你可能感兴趣的:(js,javascript)