JS的原型与6种继承方式

js的原型与继承一直是原生js最难理解的一部分,在vue中,this指针十分常用,而要弄清this指向,就要先弄清js的原型与继承。

原型
  1. js的对象分为普通对象和函数对象,每一个对象都有_proto_属性,但只有函数对象才有prototype属性(凡是通过New Function()创建的对象都是函数对象,其他的都是普通对象)。
  2. 函数对象的prototype属性指向创建它的构造函数的原型对象。
  3. 在默认情况下,所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)。
  4. 原型对象(Person.prototype)是 构造函数(Person)的一个实例
  5. 所有函数对象的proto都指向Function.prototype,它是一个空函数(Empty function)。

好处:让所有对象实例共享它所包含的属性和方法(可以跳出函数使用,不同函数需要很多相同属性时可使用)

继承

子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。(JS中从严格意义上来说并没有类这一说法)。JS中的继承主要是靠原型来实现的。

  1. 原型继承
	function Parent(){
		this.name = '张三'
	}
	
	Parent.prototype.getAge = function(){
		console.log(this.age,111)
	}
	
	function Child(){}
	
	Child.prototype = new Parent()
	
	var newChild = new Child()
	
	newChild


缺点:父类的实例也同样可以调用子类的原型方法。

  1. 原型链继承
	function Father(name,age){
       this.name = name;
       this.age = age;
	}
	
    Father.prototype.eat = function(){      
       console.log(this.name+"吃饭了");
    }
    
    function Son(){}
    
    Son.prototype = new Father("李四",20);   
           
    var s1 = new Son();      //  创建子对象
    s1
    s1.eat(); 


缺点:只能继承父类原型上的方法,却无法继承父类上的属性

  1. 构造函数继承
	function Parent(name){
	    this.name = name;
	    this.colors = ['red','green','pink'];
	}
	
	Parent.prototype.getName = function(){
	    console.log(this.name)
	}
	
	function Child(){
	    Parent.call(this,'Mary');//使用call()方法继承父类构造函数中的属性
	    this.age = '18';
	}
	
	var child1 = new Child();
	
	child1


缺点:子类的实例只能继承父类的属性,却不能继承父类的原型的方法

  1. 组合继承(伪经典继承)(构造函数原型链)
	function Father(name,age){
	      this.name=name;         
	      this.age=age;
	}
	
    Father.prototype.eat=function(){            //原型的方法共享
         console.log(this.name+"吃饭了");
     }
    
    function Child(name,age,sex){      
      Father.call(this,name,age)
      this.sex=sex;
    }
    
    Child.prototype=new Father();  
    var child1=new Child("李四",20,"男");  
    child1.eat()


优点:既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性
缺点:父类被执行了两次,在使用 call 或 apply 继承属性时执行一次,在创建实例替换子类原型时又被执行了一次

  1. 原型式继承
    核心:原型式继承的create方法本质上是对参数对象的一个浅拷贝
    缺点:父类的引用属性会被所有子类实例共享。子类构建实例时不能向父类传递参数

  2. 寄生式继承

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值