使用js模擬面向?qū)ο罄^承:先上最終的代碼
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.getName = function () {
return this.name
}
Person.prototype.getAge = function () {
return this.age
}
function Teacher(name, age, subject) {
Person.call(this, name, age)
this.subject = subject
}
// 繼承方法的最終方案:
// ES6 之前拋棄默認(rèn)的 Teacher.prototype
// Teacher.prototype = Object.create(Person.prototype)
//ES6 開始直接修改現(xiàn)有的 Teacher.prototype
Object.setPrototypeOf(Teacher.prototype, Person.prototype)
Teacher.prototype.constructor = Teacher
console.log(Teacher.prototype)
let teac = new Teacher('zs', 18, 'gaoshu')
console.log(teac.getName())
console.log(teac.constructor)
1. 先創(chuàng)建一個(gè)Person函數(shù)
function Person(name, age) {
this.name = name
this.age = age
}
2. 完善Person.prototype的方法
Person.prototype.getName = function () {
return this.name
}
Person.prototype.getAge = function () {
return this.age
}
3. 使用new來新建teac對象
let teac = new Teacher('zs', 18, 'gaoshu')
4. 此時(shí)teac只有Peoron函數(shù)的屬性累舷,并沒有繼承Person.prototype的方法,所以需要繼承方法则果,方法二選一逢勾,后者性能略微好一些
// ES6 之前會拋棄默認(rèn)的 Teacher.prototype
Teacher.prototype = Object.create(Person.prototype)
//ES6 開始直接修改現(xiàn)有的 Teacher.prototype
Object.setPrototypeOf(Teacher.prototype, Person.prototype)
5. 此時(shí)雖然繼承了方法鸟顺,但是Teacher.prototype.constructor的值是Person榜轿,想一下為什么?所以我們來修復(fù)它
Teacher.prototype.constructor = Teacher
- 以上