Javascript基礎(chǔ)(1)

變量聲明

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即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容