传统圣杯模式
// 父构造函数
Father.prototype.name = 'hehe';
function Father() {}
// 子构造函数
function Chilren() {}
// 子构造函数
function inherit(Target, Origin) {
// 预置空的构造函数作为中间件
function F() {}
// 定义中间件继承Origin(Father)的原型,并链接原型链
F.prototype = Origin.prototype;
// 空的构造函数已完全接收原型链Origin(Father)对象的属性及方法,在通过new 空的构造函数断开原型链,造成对象属性转移(断链),并把新对象引用到Target(Chilren)需要挂载的对象身上,以保持挂载对象Target(Chilren)及Origin(Father)对象的纯净
Target.prototype = new F();
// 保存Origin(Father)构造函数对象,以保证以后查看确定其继承对象是否正确
Target.prototype.uber = Target.prototype.constructor;
// 因为原型链的改变,当前Target(Chilren)的constructor指向父级构造函数(Origin(Father)对象),在此修改挂载对象Target(Chilren)的constructor指向为自己构造函数
Target.prototype.constructor = Target;
}
// 运行inherit函数开始继承对象原型
inherit(Chilren, Father)
let chilren = new Chilren()
console.log(chilren);
YUI中的圣杯模式
// 父构造函数
Father.prototype.name = 'hehe';
function Father() {}
// 子构造函数
function Chilren() {}
let inherit = (function() {
let F = function() {}
return function(Target, Origin) {
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.uber = Target.prototype.constructor;
Target.prototype.constructor = Target;
}
}())
inherit(Chilren, Car)
let chilren = new Chilren()
console.log(chilren);
网友评论