【Javascript】几种继承模式(传统、call/apply、共享原型、圣杯模式)

1、传统模式 —— 原型链

Son.prototype = new Father()
  • 过多的继承了没用的属性。

2、借用构造函数 —— call、apply

var son = {};
Father.call(son)
  • 不能继承借用的构造函数的原型
  • 多走一个函数

3、 共享原型

  • 不能随便改动自己的原型,因为指向同一个空间。
function Father(){}
function Son(){}

Father.prototype.lastName = 'qin';
Son.prototype = Father.prototype;

var son = new Son();

在这里插入图片描述

4、圣杯模式

基于的方法还是共享原型。

需要一个中间层。

function Father(){}
function Son(){}
Father.prototype.lastName = 'qin';

function extend(Target, Origin){
	function Mid(){}
	Mid.prototype = Origin.prototype;
	Target.prototype = new Mid();
}

extend(Son, Father);
var son = new Son();

在这里插入图片描述

可以向Son的原型中添加属性而不影响Father的原型。

这样son.constructor指向的为Father.

所以要修改extend方法如下:

function extend(Target, Origin){
  function Mid(){}
  Mid.prototype = Origin.prototype;
  Target.prototype = new Mid();
  Target.prototype.constructor = Target  
}

最终写法

function Father(){}
function Son(){}
Father.prototype.lastName = 'qin';

var extend = (function(){
	var Mid = function(){}
	return function (Target, Origin){
  		Mid.prototype = Origin.prototype;
  		Target.prototype = new Mid();
  		Target.prototype.constructor = Target  
  	}
}())

extend(Son, Father);
var son = new Son();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值