JS中实现继承的几种方式总结

一. 两个当个对象之间的继承

     Object.setPrototypeOf(子对象,父对象)

	var father={balance:10000000000,car:"=B="};

	function Student(sname,sage){//this-->刚创建的空对象
		this.sname=sname;
		this.sage=sage;
	}
	
	
	var lilei=new Student("Li Lei",18);
	var hmm=new Student("Han Meimei",19);
	
	
	/*仅修改一个子对象的父对象*/
	//hmm.__proto__=father;
	Object.setPrototypeOf(hmm,father);
	console.log(hmm.balance); //1000.....
	




二. 修改构造函数的原型对象------构造函数.Prototype=父对象

    替换构造函数的原型对象(prototype),为新父对象:
             结果:将来再创建的子对象,所有新创建的子对象都继承新父对象
             时机:在刚刚定义完构造函数后,立刻修改!
                        在修改原prototype对象和创建新子对象之前
             步骤:1. 构造函数.prototype=新父对象
                        2. 构造函数.prototype.constructor=构造函数对象

      该方法必须在创建对象之前才有效

	var father={balance:10000000000,car:"=B="};

	function Student(sname,sage){//this-->刚创建的空对象
		this.sname=sname;
		this.sage=sage;
	}//prototype-->Student.prototype
	Student.prototype=father;
	Student.prototype.constructor=Student;
	//prototype-->father
        //凡是子对象共有的属性值和方法,都要放在构造函数的原型中
	Student.prototype.intrSelf=function(){
		console.log("I'm "+this.sname+",I'm "+this.sage);
	}//prototype.intrSelf
	 //father.intrSelf
	
	var lilei=new Student("Li Lei",18);
	var hmm=new Student("Han Meimei",19);
	
	
	/*仅修改一个子对象的父对象*/
	//hmm.__proto__=father;
	//Object.setPrototypeOf(hmm,father);
	console.log(hmm.balance); //1000.....
	console.log(lilei.balance);//1000.....
	lilei.intrSelf();
	hmm.intrSelf();

三.  用一个已有的父对象作为参照,创建一个新子对象,同时,扩展子对象自有属性。 
              var son=Object.create(父对象);
              2件事: 1. 创建空对象son
                      2. 设置son的__proto__指向父对象

              var son=Object.create(父对象,

{

    扩展属性名1:{
writable:true,
value:属性值,

configurable:true

},

                     扩展属性名2:{...}

              });

	var father={balance:10000000000,car:"=B="};
	var son=Object.create(father,{
		favorite:{value:"坑爹"/*,writable:true*/}
	});
	console.log(son.balance);
	console.log(son.favorite);
	console.log(son.hasOwnProperty("favorite"));//true
	son.favorite="飙车";
	console.log(son.favorite);



四. 既继承结构,又继承原型:——推荐的继承方式

何时使用:两种类型间的继承

1. 子类型构造函数开始位置,借用父类型构造函数:
                       父类型构造函数.call(this,参数列表)
                       父类型构造函数.apply(this,[参数列表])
     强调:仅完成第一步,只是借用构造函数中的语句而已
                没有实现任何对象间的继承

 function sub(){

Super.call(this, 参数....);

sub的扩展属性

}


2. 定义构造函数后,设置子类型构造函数的prototype继承父类型的prototype:

Object.setPrototypeOf(sub.prototype, parent.prototype)


Apply 示例:

 1 <script type="text/javascript">
 2     /*定义一个人类*/
 3     function Person(name,age)
 4     {
 5         this.name=name;
 6         this.age=age;
 7     }
 8     /*定义一个学生类*/
 9     function Student(name,age,grade)
10     {
             Person.call(this,name,age);
11         //或使用Person.apply(this,arguments);
12         this.grade=grade;
13     }
14     //创建一个学生类
15     var student=new Student("qian",21,"一年级");
16     //测试
17     alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);
18     //大家可以看到测试结果name: qian  age:21  grade:一年级
19     //学生类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处.
20 </script>


	/*定义所有飞行物类型的构造函数*/
	function Flyer(fname,speed){
		this.fname=fname;  this.speed=speed;
	}
	Flyer.prototype.fly=function(){//所有飞行物都能飞行
	console.log(this.fname+" 以 "+this.speed+" 时速飞行");
	}
	var bird=new Flyer("小麻雀",60);
	bird.fly();
	/*定义飞机类型的构造函数:名称,速度,载客数*/
	function Plane(fname,speed,capacity){
		Flyer.call(this,fname,speed);//——借用构造函数
		this.capacity=capacity;
	}//Plane.prototype 继承 Flyer.prototype
        Object.setPrototypeOf(Plane.prototype,Flyer.prototype);
	Plane.prototype.fly=function(){
		console.log(this.fname+" 搭载 "+
		            this.capacity+" 名乘客以 "+
					this.speed+" 时速飞行");
	}
	var A380=new Plane("A380",1000,555);
	A380.fly();//?



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值