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();