2019-04-25
構(gòu)造函數(shù)
Javascript提供了構(gòu)造函數(shù)(Constructor)模式實(shí)現(xiàn)類的設(shè)計(jì)與封裝媒区。
function 構(gòu)造函數(shù)名(參數(shù)1,參數(shù)2 … ){
this.屬性1 = 參數(shù)1;
this.屬性2 = 參數(shù)2;
…..
this.方法1 = function(參數(shù)1,參數(shù)2…){
}
……
}
var 引用名 = new 構(gòu)造函數(shù)名(參數(shù)1,參數(shù)2…);
class關(guān)鍵字
? ES6 提供了更接近傳統(tǒng)語(yǔ)言的寫法颤介,引入了 Class(類)這個(gè)概念酸钦,作為對(duì)象的模板。通過(guò)class關(guān)鍵字甜害,可以定義類舶掖。類的數(shù)據(jù)類型本質(zhì)就是函數(shù)。
class 類名{
constructor(參數(shù)1,參數(shù)2… ) {
this.屬性1 = 參數(shù)1;
this.屬性2 = 參數(shù)2;
……
}
方法1(參數(shù)1,參數(shù)2…){
}
… ….
}
var 引用名 = new 類名(參數(shù)1,參數(shù)2…);
繼承
原型鏈繼承
? 每個(gè)JavaScript構(gòu)造函數(shù)都有一個(gè)prototype屬性尔店,可以指向另一個(gè)對(duì)象眨攘。當(dāng)訪問(wèn)對(duì)象某個(gè)屬性時(shí)主慰,JavaScript引擎會(huì)在該對(duì)象的所有屬性中查找,如果沒(méi)有找到就從prototype屬性指向的對(duì)象中查找期犬。
function Animal() {
this.eat = function() {
document.write("吃東西" + "<br />");
}
}
function Bird() {
this.fly = function() {
document.write("飛行" + "<br />");
}
}
Bird.prototype = new Animal();
var obj = new Bird();
obj.fly();
obj.eat();
使用call方法繼承
function Account(id, password, balance) {
this.id = id;
this.password = password;
this.balance = balance;
}
function CreditAccount(id, password, balance, overdraft) {
Account.call(this, id, password, balance);
this.overdraft = overdraft;
}
var acc = new CreditAccount("0001", "123456", 1000, 20000);
document.write("賬號(hào):" + acc.id + "<br />");
document.write("密碼:" + acc.password + "<br />");
document.write("余額:" + acc.balance + "<br />");
document.write("透支額:" + acc.overdraft + "<br />");
通過(guò)實(shí)例直接繼承
function Account(id, password, balance) {
this.id = id;
this.password = password;
this.balance = balance;
}
var acc1 = new Account("0001", "123456", 1000);
var acc2 = Object.create(acc1);
acc2.overdraft = 20000;
document.write("賬號(hào):" + acc2.id + "<br />");
document.write("密碼:" + acc2.password + "<br />");
document.write("余額:" + acc2.balance + "<br />");
document.write("透支額:" + acc2.overdraft + "<br />");
通過(guò)extends關(guān)鍵字繼承
class 子類名 extends 父類名{
}
class CreditAccount extends Account{
constructor(id, password, balance,overdraft) {
super(id, password, balance);
this.overdraft = overdraft;
}
show () {
return super.show()+",透支額:"+this.overdraft;
}
}
var acc1 = new CreditAccount ("0001", "123456", 1000, 5000);
document.write(acc1.show());
閉包
? 變量的作用域有兩種:全局變量和局部變量河哑。JS在函數(shù)內(nèi)部可以直接讀取全局變量。在函數(shù)外部則無(wú)法讀取函數(shù)內(nèi)的局部變量龟虎。
// 既然f2可以讀取f1中的局部變量,那么只要把f2作為返回值沙庐,就可以在f1外部讀取它的內(nèi)部變量了
// f2函數(shù)即為閉包鲤妥。
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result = f1();
result();
? 由于在Javascript語(yǔ)言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取函數(shù)的局部變量拱雏,因此可以把閉包簡(jiǎn)單理解成"定義在函數(shù)內(nèi)部的函數(shù)"棉安。
閉包的用處:
讀取函數(shù)內(nèi)部變量
將函數(shù)變量的值始終保持在內(nèi)存中,延長(zhǎng)生存期