變量聲明
var聲明變量會在最先聲明,但不會賦值,返回值為undefind
function聲明函數(shù)也會在最先聲明,但會直接進(jìn)行定義,可以直接調(diào)用
函數(shù)有形參相當(dāng)于提前聲明變量
var a=123;
function fun(){
alert(a);
var a=456;
}
fun();
alert(a); //undefind
var a=123;
function fun(){
alert(a);
a=456;
}
fun();
alert(a); //456
var a=123;
function fun(a){
alert(a);
a=456;
}
fun();
alert(a); //undefind 456
構(gòu)造函數(shù)的執(zhí)行流程
1.立刻創(chuàng)建一個新的對象
2.將創(chuàng)建的對象設(shè)置為函數(shù)中的this,在構(gòu)造函數(shù)中可以使用this來引用新建的對象
3.逐行執(zhí)行函數(shù)中的代碼
4.將新建的對象作為返回值返回
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
this.sayName=function(){
alert(this.name);
};
}
var per= new Person("孫悟空",18,"男");
console.log(per);
使用同一個構(gòu)造函數(shù)創(chuàng)建的對象,我們成為一類對象,也將一個構(gòu)造函數(shù)稱為一個類。
我們將通過一個構(gòu)造函數(shù)創(chuàng)建的對象稱為該類的一個實(shí)例。
console.log(per instanceof Person);
使用instanceof可以檢查一個對象是否是一個類的實(shí)例。
所有對象都是object后代,任何對象和object做instanceof都得到true。
call()和apply()
這兩個方法都是函數(shù)對象的方法,需要通過函數(shù)對象來調(diào)用
當(dāng)對函數(shù)調(diào)用call()和apply()都會調(diào)用函數(shù)執(zhí)行
在調(diào)用call()和apply()可以將一個對象指定為第一個參數(shù),此時這個對象將會成為函數(shù)執(zhí)行的this
call()方法可以將實(shí)參在對象之后一次傳遞
apply()方法需要將實(shí)參封裝到一個數(shù)組中統(tǒng)一傳遞
this的情況
- 當(dāng)以函數(shù)形式調(diào)用時,this是window
- 當(dāng)以方法的形式調(diào)用時,誰調(diào)用方法this就是誰
- 當(dāng)以構(gòu)造函數(shù)的形式調(diào)用時,this就是新創(chuàng)建的對象
- 使用call和apply調(diào)用時,this是指定的那個對象
原型prototype
我們所創(chuàng)建的每一個函數(shù),解析器都會向函數(shù)中添加一個屬性prototype,這個屬性對應(yīng)著一個對象,這個對象就是原型對象。
如果函數(shù)作為普通函數(shù)調(diào)用prototype沒有任何作用,當(dāng)函數(shù)以構(gòu)造函數(shù)的形式調(diào)用時,他所創(chuàng)建的對象中都會有一個隱含的屬性,指向該構(gòu)造函數(shù)的原型對象,我們可以通過_prototype_來訪問該屬性。
原型對象相當(dāng)于一個公共區(qū)域,所有同一個類的實(shí)例都可以訪問到這個原型對象,我們可以將對象中共有的內(nèi)容,統(tǒng)一設(shè)置到原型對象中。
當(dāng)我們訪問對象的屬性或方法時,它會現(xiàn)在對象自身中尋找,如果有則直接使用,如果沒有則會去原型對象中尋找,找到則直接使用
function Myclass(){
}
Myclass.prototype.a=123;
var mc= new Myclass();
var mc2= new Myclass();
mc.a=234
console.log(mc.a); //234
console.log(mc2.a); //123
使用in檢查對象中是否含有某個屬性時,如果對象中沒有但原型中有,也會返回true
console.log("name" in mc);
可以使用對象的hasOwnProperty()來檢查對象自身是否含有該屬性。
console.log(mc.hasOwnProperty("name"));
原型對象也是對象,它也有原型,當(dāng)我們使用一個對象的屬性和方法時,會在自身中尋找,有則直接使用,沒有則去原型對象中尋找,有則直接使用,沒有則去原型的原型中尋找,知道找到Object對象的原型,Object對象的原型沒有原型。
console.log(mc.__proto__.__proto__.__proto__);//null
tostring()方法
當(dāng)我們直接在頁面中打印一個對象時,實(shí)際上輸出的是對象的tostring()方法的返回值。
如果我們希望在輸出對象時不輸出[object object],可以為對象添加一個tostring()方法
per.tostring=function(){
return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]"
}
或者直接修改原型中的tostring()方法
Person.prototype.tostring=function(){
return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]"
}
垃圾回收
當(dāng)一個對象沒有任何的變量或者屬性對它進(jìn)行引用,此時我們將永遠(yuǎn)無法操作該對象,此時這種對象就是一個垃圾,這種對象過多會占用大量空間,使程序運(yùn)行變慢,所以必須進(jìn)行清理。
在js中有自動的垃圾處理機(jī)制,會自動的將這些垃圾對象從內(nèi)存中銷毀。
我們不需要也不能進(jìn)行垃圾回收的操作
我們只需要將不再使用的對象設(shè)置為null即可