在ES6之前,javascript不跟其他語言一樣,有直接繼承的方法,它需要借助于建構式+原型物件模擬實作繼承,現在我們可以利用ES6的extends方法實作繼承,如果想了解更多有關ES6實作的繼承請查看《ES6學習筆記(二):教你玩轉類的繼承和類的物件》,在這里不再做更多的介紹,
ES6之前并沒有給我們提供extends繼承,我們可以通過建構式+原型物件模擬實作繼承,被稱為組合繼承,
1. call()
呼叫這個函式,并且修改函式運行時的this指向
fun.call(thisArg, arg1,arg2,...)
- thisArg:當前呼叫函式this的指向物件
- arg1, arg2:傳遞的普通引數
function fn() {
console.log('前端嵐楓')
console.log(this)
}
fn.call() //說明call()可以呼叫函式,this指向window
var obj = {
name: 'lanfeng
}
fn.call(obj) //this指向obj, 說明call可以改變this指向
2. 借用建構式繼承父型別屬性
核心思想:通過call()把父型別的this指向子型別的this,這樣就可以實作子型別繼承父型別的屬性,
// 借用父建構式繼承屬性
//父建構式
function Father (uname, age) {
//this指向父建構式的物件實體
this.uname = uname
this.age = age
}
// 子建構式
function Son (uname, age){
// this指向子建構式的物件實體
//借助于call,this指向子建構式物件實體
Father.call(this, uname, age)
}
var son = new Son('王俊凱',18)
console.log(son) //
3. 借用原型物件繼承父型別方法
// 父建構式
function Father (uname, age) {
//this指向父建構式的物件實體
this.uname = uname
this.age = age
}
// 父原型方法
Father.prototype.money = function() {
console.log(10000)
}
// 子建構式
function Son (uname, age){
// this指向子建構式的物件實體
//借助于call,this指向子建構式物件實體
Father.call(this, uname, age)
}
// Son.prototype = Father.prototype 這樣直接賦值會有問題,如果修改了子原型物件,父原型物件也會變化/
Son.prototype = new Father()
//手動改constructor指回原來的建構式
Son.prototype.constructor = Son
Son.prototype.exam= function() {
console.log('考試')
}
var son = new Son('王俊凱',18)
console.log(son) //
son
結構關系如下圖:
總結
今天主要分享了call()方法的用法和javascript通過建構式+原型物件模擬實作繼承的方式,
如果想了解更多請掃描二維碼

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/146319.html
標籤:JavaScript
下一篇:01.JS塊級作用域與let
