// 公司
function Company(name, address) {
this.name = name;
this.address = address;
this.stafts = [];
}
// 雇用
Company.prototype.hire = function (staft) {
this.stafts.push(staft);
};
// 開除
Company.prototype.fire = function (staft) {
var i = this.stafts.indexOf(staft);
if (i >= 0) {
this.stafts.splice(i, 1);
}
};
// 員工
function Staff(company, name) {
this.company = company; // 每個員工都會儲存對其公司的參考
this.name = name;
company.hire(this); // 把自己加到公司的雇用表(staft hire)
}
// 離職
Staff.prototype.quit = function () {
this.company.fire(this);
};
// 經理 (將特定類型的員工實作為 Staff 的子類別)
function Manager(company, name) {
// 為了確保 Manager 實體會正確地被初始化為 Staff, 這個建構式必須明確地呼叫 Staft 建構式
// 把新產生的物件bind為 Staff 的接收者
// 呼叫 Staff 建構式首先能先確保 Staff 所建立的所有實體特性都會被加入到新物件中
Staff.call(this, company, name);
// 接著 Manager 就能定義他自己的實體特性, 例如 title
this.title = "Manager";
}
// 為了使 Manager 成為 Staff 的子類別, 他的原形(prototype)必須繼承自 Staff.prototype
Manager.prototype =
Object.create(Staff.prototype);
// 一旦建立了 Manager 的原形物件, 就可以為他加上所有實體都會共用的特性
Manager.prototype.duty = "lead
stafts";
// 建立公司
// 建立公司
var hc = new Company("TheHappyCompany", "taiwan");
// 新增員工
var ian = new Manager(hc, "Ian"); // Manager {company: Company, name: "Ian", title: "Manager", duty: "lead stafts", quit: function}
var jay = new Staff(hc, "Jay"); // Staff {company: Company, name: "Jay", quit: function}
var ben = new Staff(hc, "Ben");
hc.fire(jay); // 將指定員工開除
var jay = new Staff(hc, "Jay"); // Staff {company: Company, name: "Jay", quit: function}
var ben = new Staff(hc, "Ben");
hc.fire(jay); // 將指定員工開除
沒有留言:
張貼留言