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 


	/*定义所有飞行物类型的构造函数*/
	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();//?



你可能感兴趣的:(JavaScript)