2013年8月17日 星期六

建立公司,雇用員工:從子類別的建構式呼叫超類別的建構式 (借用建構式)

// 公司
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); // 將指定員工開除

沒有留言: