js 继承

原创
2018/07/13 00:38
阅读数 13

        js继承通常采用对象冒充和原型链添加方法的方式,对象冒充只能继承实例属性(包括实例方法,只不过方法一般情况可以复用,所以不建议使用实例方法。方法可以写在原型链上方便子类类继承使用),原型链只能继承父类的原型属性,无法继承实例属性。

一,采用对象冒充实现继承

//创建一个父类

function Parent(name,age){ this.name=name; this.age=age; } //给父类添加一个原型方法 Parent.prototype.say=function(){ console.log("我是:"+this.name+",今年:"+this.age); }

//创建一个子类 function Son(name,age){ Parent.apply(this,arguments); }

//查看子类是否具备父类中继承的实例属性 var son=new Son('小头儿子',5); console.log(son.name); 可以看到继承了父类中的实例属性,但没有继承父类中的原型方法 //子类需要继承父类的原型方法,需要new一个父类的对象实例添加到子类的原型上 Son.prototype=new Parent();//把父类整个原型链继承过来

发现子类就具备了父类的原型方法

//完整继承实例 `//父亲类 function Parent(name,age){ this.name=name; this.age=age; } Parent.prototype.say=function(){ console.log("我是"+this.name+",我今年"+this.age+"岁了"); }

		//儿子类
		function Son(name,age,sex){
		  Parent.apply(this,arguments);
		  //由于属性扩展过程中,需要子类继承的时候就显示的写出来,所以可以定义一个方法来设置扩展属性的值
		  //			  this.sex=arguments[arguments.length-1];
		  this.sex=sex;
		}
		//继承父类的原型链
		Son.prototype=new Parent();
		
		//子类在父类基础上扩展自己方法
		Son.prototype.eat=function(){
			console.log("调用父类中继承的方法");
			this.say();
		}
		
		//设置性别,由于实例方法不能被继承,而实例属性能,所以为了保证继承后还可用,所以采用原型方法,但个人还是推荐显示的将扩展参数写在构造方法中。
		Son.prototype.setSex=function(sex){
			this.sex=sex;
		}
		
		var son=new Son('大头儿子',5,"男");
		son.say();//子类拥有了父类的方法
		console.log(son.name);//子类拥有了父类的属性
		console.log(son instanceof Parent);//子类是否属于父类,多态性
		console.log(son instanceof Son);//子类是否属于子类
		
		son.eat();//子类自己扩展的方法
		console.log("==========")
       //son.setSex("男");
		console.log(son.sex);//子类扩展自己属性
		console.log("==========")
		
		var father=new Parent('小头爸爸',40);
		father.say();//父类调用自己的方法
		console.log(father instanceof Parent);//true
		console.log(father instanceof Son);//false
       //father.eat();//父类不应该有子类的方法:father.eat is not a function`
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部