2013-09-23 39 views
0

我正在學習JavaScript,對於如何基於現有類創建新的JavaScript類並對其進行擴展有點困惑。如何基於現有類創建新的JavaScript類並將其擴展

我有一個Person類,我創建了2個實例(John和Suzie)。現在,我想創建另一個基於Person的類(Employee),只有Employee Number等更多屬性(並且可以返回John以便從Employee類繼承)。

這是我有:

var Person = function (name, age){ 
    this.name = name || "UNKNOWN"; 
    this.age= age || "UNKNOWN"; 
} 
Person.prototype.sayHello = function() { 
    console.log("Hello, my name is " + this.name + " and I am " + this.age + " years old"); 
}; 
var john = new Person("John Smith",72); 
var Suzie = new Person("Suzie Brown", 25); 
+0

您沒有顯示任何與Employee類相關的代碼。你在想什麼,你有什麼問題? –

+0

員工類將與Person類相同,但EmployeeNumber作爲附加屬性。我只是在試驗。 – Andy

+0

[正確的JavaScript繼承]的可能的重複(http://stackoverflow.com/questions/10898786/correct-javascript-inheritance) – Bergi

回答

0

將您的原型,以你的父母的實例,請確保調用在孩子的構造函數的父類的構造:

var Person = function (name, age){ 
    this.name = name || "UNKNOWN"; 
    this.age= age || "UNKNOWN"; 
} 

Person.prototype.sayHello = function() { 
    console.log("Hello, my name is " + this.name + " and I am " + this.age + " years old"); 
}; 

var Employee = function(name, age, id) { 
    Person.call(this, name, age); 

    this.id = id || 'UNKNOWN'; 
}; 

Employee.prototype = new Person(); 

Employee.prototype.getHired = function() { 
    console.log('ZOMG I GOT HIRED! My ID # is:', this.id); 
}; 

使用它的一些示例:

var bob = new Person('Bobby', 25); 
console.log(bob.name); //Bobby 
console.log(bob.age); //25 
console.log(bob.id); //undefined 
bob.sayHello(); //Hello, my name is Bobby and I am 25 years old 

var suse = new Employee('Susan', 32, 1337); 
console.log(suse.name); //Susan 
console.log(suse.age); //32 
console.log(suse.id); //1337 
suse.sayHello(); //Hello, my name is Susan and I am 32 years old 
suse.getHired(); //ZOMG I GOT HIRED! My ID # is: 1337 
0
//create Employee 
var Employee = function(name, age, ...extra parameters){ 
    this.name = name || "UNKNOWN"; 
    this.age= age || "UNKNOWN"; 
    //employee related stuff... 
}; 
//extend Person 
Employee.prototype = new Person(); 
+0

不應該檢查名稱和年齡在人做?並且通過調用'Person.apply(this,arguments)'來獲得從它繼承的對象,或者如果你想具體說明這些參數:'Person.call(this,name,age);'Employee.prototype .constructor不指向Employee,並且不需要爲繼承創建Person實例。這種問題已經有很多問題了,這就是爲什麼我試圖制定一個涵蓋繼承,覆蓋和調用超級的答案http://stackoverflow.com/a/16063711/1641941 – HMR

0
var Employee = function (name, age, employeeNumber) { 
    ... 
}; 

Employee.prototype = new Person(); // copies Person's name and age to Employee 
Employee.prototype.employeeNumber = 0; // or whatever defaults you want 

var Bob = new Employee(...); 
+0

如果在Person中創建了許多實例變量,並且如果它們是可變的,那麼在Employee體中調用'Person.apply(this,arguments);'會更節省:http://stackoverflow.com/a/16063711/1641941 – HMR