建構函式和原型
阿新 • • 發佈:2020-12-24
技術標籤:JavaScript
在ES6之前,物件不是基於類建立的,而是用一種稱為構建函式的特殊函式來定義物件和它們的特徵
建立物件的三種方式:
- 物件字面量
var obj = {};
- new Object()
var obj = new Object()
- 自定義建構函式
function Star(uname,age){ this.uname = uname; this.age = age; this.sing = function(){ console.log('唱歌') } } var ldh = new Star('劉德華',18) //例項成員就是建構函式內部通過this新增的成員uname age sing 就是例項成員 //例項成員只能通過例項化的物件來訪問 Star.sex = '男' //靜態成員在建構函式本身上新增的成員 sex就是靜態成員 //靜態成員只能通過建構函式來訪問 console.log(Star.sex )
建構函式
建構函式是一種特殊的函式,主要用來初始化物件,即為物件成員變數賦初始值,它總與new一起使用,我們可以把物件中一些公共的屬性和方法抽取出來,然後封裝到這個函式裡面
new在執行時會做四件事情
- 在記憶體中建立一個新的空物件
- 讓this指向這個新的物件
- 執行結構函式裡面的程式碼,給這個新物件新增屬性和方法
- 返回這個新物件(所以建構函式裡面不需要return)
建構函式方法很好用 , 但是存在浪費記憶體的問題
建構函式原型 prototype
建構函式通過原型分配的函式是所有物件所共享的
JavaScript規定 , 每一個建構函式都有一個prototype屬性 , 指向另一個屬性 . 注意這個prototype就是一個物件 , 這個物件的所有屬性和方法,都會被建構函式所擁有
我們可以把那些不變的方法 , 直接定義在prototype物件上 , 這樣所有物件的例項就可以共享這些方法
物件原型 _proto_
物件都會有一個屬性_proto_指向建構函式的prototype原型物件 , 之所以我們物件可以使用建構函式prototype原型物件的屬性和方法 , 就是因為物件有_proto_原型的存在
_proto_物件原型和原型物件prototype是等價的
constructor 建構函式
物件原型(_proto_)和建構函式(prototype)原型物件裡面都有一個屬性constructor屬性 , constructor我們稱為建構函式,因為它指回構函式本身
繼承
ES6之前並沒有給我們提供extends繼承,我們可以通過建構函式+原型物件模擬實現繼承, 被稱為組合繼承
call()
呼叫這個函式 , 並且修改函式執行時的this指向
fun.call(thisArg, arg1 , arg2 , ...)
- thisArg:當前呼叫函式this的指向物件
- arg1, arg2 :傳遞的其他引數
借用建構函式繼承父型別屬性
核心原理:通過call()把父型別的this指向子型別的this , 這樣就可以實現子型別繼承父型別的屬性
//借用父建構函式繼承屬性
//1.父建構函式
function Father(uname, age) {
//this 指向父建構函式的物件例項
this.uname = uname;
this.age = age;
}
//2. 子建構函式
function Son(uname, age) {
//this指向子建構函式
Father.call(this, uname, age);
}
var son = new Son("ldh", 18);
console.log(son);