原生js底层基础(十一)JavaScript 继承的几种方式

继承的三种模式

1.借用构造函数(call和apply)
作用:改变this指向,利用别人的函数,实现了自己的功能
(1)call

栗子1:

function Car (color,width,height){
this.color = color; //调用call之前这个this是window, //将引用传给obj后,这个this指向的是obj
	this.width = width;
	this.height = height;
} 

var car = new Car('green','2000','2000')
var obj = { }

Car.call( obj, "red" , "1900", " 900" ); //第二个参数开始是给obj的属性传参

此时obj拥有属性

obj
{color: "red", width: "1900", height: " 900"}

栗子2:

function Person(name,age,sex){
 this.name = name;
 this.age = age;
  this. sex = sex;
}

function Student (name,age,sex,classa ){
	//系统默认指定了this
   // var this={ Object.create(Student.prototype) }
	Person.call( this,name,age,sex);
	this.classa = classa;
}
var student = new Student("a",10,"男","1190");

此时student拥有4个属性

student
Student {name: "a", age: 10, sex: "男", classa: "1190"}
(2)apply

和call一样 但是传参时以数组的形式传进去,例如

Person.call(  [this,[name,age,sex ] );//多加一个方括号在参数外

缺点:
call指向的引用必须完全使用父级的属性,也就是说需求完全涵盖父级的,再考虑使用,你可以在他的基础上添加,但不能减少他的原有属性。即在实际中,如果别人写了一个基础方法满足你的需求,你就用他的方法。

2.共享原型

即父类和子类都用同一个原型

Father.prototype.money=1000
function Father(){}
function Son(){}

function inherit(Target,Origin){
	Target.prototype = Origin.prototype;
}
inherit(Son,Father);
var son = new Son();		//注意和上一句的次序不能变
var father = new Father();
Son.prototype.sex='male';  //此时father和son都有sex属性

缺点:父类跟子类互相影响

3.圣杯模式(继承的最佳写法)
function inherit(Target,Origin){
	function F(){}
	F.prototype = Origin.prototype;
	Target.prototype = new F( );   //与上一行的位置不能变
	Target.prototype.constructor=Target;//指定,否则会是Origin,非必要
	Target.prototype.uber= Origin.prototype;//指明原型,即super,非必要
}
function Father( ){ }
function Son( ){ }
Father.prototype.name="father ";
inherit(Son,Father);

var son =new Son();
var father = new Father();
son.name;	-->"father"    //继承父亲的属性
son.sex="male";          //自定义自己的属性
son.sex  -->"male"		
father.sex   -->undefined	//父没有子的属性,不会受到子的影响

雅虎的写法,把继承函数写成了立即执行,其他的都一样

var inherit = (function(){
	var F = function(){} 
	return function(Target,Origin){
	F.prototype = Origin.prototype;
	Target.prototype = new F();
	Target.prototype.constructor = Target;
	Target.prototype.uber = Origin.prototype;
	}
}())
function Father(){} 
function Son(){}
Father.prototype.lastName='aa';
inherit(Son,Father);
var father = new Father();var son = new Son()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值