2016-08-18 52 views
0

這是父類Javascript的繼承可以這樣做嗎?它有效,但它是一個正確的方式?

function Person(name,age) 
{ 
    this.name = name; 
    this.age =age; 
    this.alertAge = function(){ 
     alert(age) 
    }; 
    this.alertName = function(){ 
     alert(this.name) 
    } 
    this.setName = function(name){ 
     this.name = name; 
    } 
} 

這是1級子類

function Student(name,age,id){ 
    this.id = id; 
    Person.call(this,name,age); 
} 

這是級別2子類

function IStudent(name,age,id,children) 
{ 
    this.children = children; 
    Student.call(this,name,age,id) 
} 

這是1級子對象

let s1 = new Student('Jacob',21,1001); 
console.log(s1) 

這是2級子對象

let s2 = new IStudent('Jonathan',28,1002,1); 
console.log(s2) 
s2.setName('Ramoji'); 
console.log(s2) 

回答

0

你忘了原型鏈

你需要將這些行添加到您的代碼:

​​

IStudent.prototype = Object.create(Student.prototype); 
IStudent.prototype.constructor = IStudent; 

所以你可以像這樣重新編寫代碼:

Person.prototype.alertAge = function() { 
    alert(this.age); 
} 
+0

我試圖瞭解什麼是錯誤的,如果我遺漏了原型鏈。例如:s2.setName函數在這裏工作正常。我能夠創建孩子並對它們進行實例化,調用父母函數等,這讓我感到困惑,因爲我認爲如果沒有原型鏈,這些都不會起作用。 –

+0

你做了什麼工作,因爲你沒有在原型對象中聲明你的函數'setName','alertName'。事實上,你並沒有真正使用繼承,通過調用Person的構造函數,你只是使用關鍵字'this'來影響一些對象變量,僅此而已...... –

+0

爲什麼這不是繼承?我想通過這樣做來理解我會想念的。在什麼時候我不會得到某種繼承特徵? –

相關問題