继承、隔离、圣杯模式
继承
Professor.prototype = {
name: "Mr. Zhang",
tSkill: "JAVA",
};
function Professor() {}
let professor = new Professor();
Teacher.prototype = professor;
function Teacher() {
this.name = "Mr. Wang";
this.mSkill = "JS/JQ";
}
let teacher = new Teacher();
//call/apply
function Teacher(name, mSkill) {
this.name = name
this.mSkill = mSkill
}
function Student(name, mSkill, age, major) {
Teacher.apply(this, [name, mSkill])
// 在Student构造函数内把Student实例化的对象传给Teacher构造函数
this.age = age
this.major = major
}
隔离
function Buffer() {}
let buffer = new Buffer();
Buffer.prototype = Teacher.prototype;
Student.prototype = buffer;
Student.prototype.age = 18;
封装隔离方法
function inherit(Target, Origin) {
function Buffer() {}
Buffer.prototype = Origin.prototype;
Target.prototype = new Buffer();
Target.prototype.constructor = Target;
Target.prototype.super_class = Origin;
}
function test() {
let num = 0;
function add() {
num++;
console.log(num);
}
return add;
}
let add = test();
// 用闭包做inherit方法
let inherit = (function () {
let Buffer = function () {}
return function (Target, Origin) {
Buffer.prototype = Origin.prototype
Target.prototype = new Buffer()
Target.prototype.constructor = Target
Target.prototype.super_class = Origin
}
})()
案例
let initProgrammer = (function () {
let Programmer = function () {};
Programmer.prototype = {
name: "程序员",
tool: "计算机",
work: "编写应用程序",
duration: "10个小时",
say: function () {
console.log(
"我是一名" + this.myName + this.name + ",我的工作是用" + this.tool + this.work +
",我每天工作" + this.duration + "小时,我的工作需要用到" + this.lang.toString() + "。"
);
},
};
function FrontEnd() {}
function BackEnd() {}
inherit(FrontEnd, Programmer);
inherit(BackEnd, Programmer);
FrontEnd.prototype.lang = ["HTML", "CSS", "Javascript"];
FrontEnd.prototype.myName = "前端";
BackEnd.prototype.lang = ["Node", "Java", "SQL"];
BackEnd.prototype.myName = "后端";
return {
FrontEnd: FrontEnd,
BackEnd: BackEnd,
};
})();
let frontEnd = new initProgrammer.FrontEnd();
let backEnd = new initProgrammer.BackEnd();
frontEnd.say();
课后作业
window.onload = function () {
init();
};
function init() {
console.log(initFb(10));
console.log(initDiv(100));
}
let initFb = (function () {
function fb(n) {
if (n <= 0) {
return 0;
}
if (n <= 2) {
return 1;
}
return fb(n - 1) + fb(n - 2);
}
return fb;
})();
let initDiv = (function () {
function div(n) {
let arr = [];
for (let i = 0; i <= n; i++) {
if (i % 3 === 0 || i % 5 === 0 || i % 7 === 0) {
arr.push(i);
}
return arr;
}
}
return div;
})();