一、數(shù)據(jù)類型
JavaScript的數(shù)據(jù)類型可以分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。
- 基本數(shù)據(jù)類型(6種)
- String
- Number
- Boolean
- null
- undefined
- Symbol(ES6)
- 引用數(shù)據(jù)類型
- Object
二、面向?qū)ο缶幊?/strong>
- 構造函數(shù)
- 面向?qū)ο缶幊痰牡谝徊?,就是要生成對象。前面說過,對象是單個實物的抽象。通常需要一個模板,表示某一類實物的共同特征,然后對象根據(jù)這個模板生成。
- JavaScript 語言使用構造函數(shù)(constructor)作為對象的模板。所謂”構造函數(shù)”,就是專門用來生成實例對象的函數(shù)。它就是對象的模板,描述實例對象的基本結構。一個構造函數(shù),可以生成多個實例對象,這些實例對象都有相同的結構。
- 構造函數(shù)就是一個普通的函數(shù),為了與普通函數(shù)區(qū)別,構造函數(shù)名字的第一個字母通常大寫。
構造函數(shù)的特點有兩個。
- 函數(shù)體內(nèi)部使用了this關鍵字,代表了所要生成的對象實例。
- 使用new命令生成對象。
2. new命令
new命令的作用,就是執(zhí)行構造函數(shù),返回一個實例對象。
new 命令的原理
- 創(chuàng)建一個空對象,作為將要返回的對象實例。
- 將這個空對象的原型,指向構造函數(shù)的prototype屬性。
- 將這個空對象賦值給函數(shù)內(nèi)部的this關鍵字。
- 開始執(zhí)行構造函數(shù)內(nèi)部的代碼。
如果構造函數(shù)內(nèi)部有return語句,而且return后面跟著一個對象,new命令會返回return語句指定的對象;否則,返回this對象。
var Fn=function(){
this.name='xxx';
this.old=18;
}
var f1=new Fn();
console.log(f1.name);//xxx
console.log(f1.old);//18
上面代碼通過new命令,讓構造函數(shù)Fn生成一個實例對象,保存在變量f1中。這個新生成的實例對象,從構造函數(shù)Fn得到了name和old屬性。new命令執(zhí)行時,構造函數(shù)內(nèi)部的this,就代表了新生成的實例對象,this.name和this.old是實例對象的屬性。
var Fn2=function(){
name='xxx';
old=18;
}
var f2=new Fn2();
console.log(f2.name);//undefined
console.log(f2.old);//undefined
f2.name='yyy';
console.log(f2.name);//yyy
三、原型與原型鏈
對象是函數(shù)創(chuàng)建的,而函數(shù)卻又是一種對象。也是屬性的集合,可以對函數(shù)進行自定義屬性。
每個函數(shù)都有一個屬性叫做prototype。
這個prototype的屬性值是一個對象,默認的只有一個叫做constructor的屬性,指向這個函數(shù)本身。
var Fn=function(){
this.name='xxx';
this.old=18;
}

回到上面new命令的原理的第二條,從這張圖可以看到對象的原型,指向構造函數(shù)的prototype屬性。
f1.__proto__指向構造函數(shù)的prototype屬性,就是對象的原型。所以f1.__proto__===Fn.prototype為true
prototype的屬性值是一個對象,默認的只有一個叫做constructor的屬性,指向這個函數(shù)本身。
- 029084da-917f-40e5-bea7-393ec5993b63.png
左邊為Fn函數(shù),右邊就是它的原型
在上面可以看到f1.__proto__===Fn.prototype的結果為true
__proto__就是指向構造函數(shù)的prototype屬性,Fn.prototype就是對象的原型
即,每個由構造函數(shù)創(chuàng)建的對象都有一個proto屬性,指向創(chuàng)建該對象的函數(shù)的prototype。
基于以上,我們得到一個重要的公式
var 對象名 = new 函數(shù)名()
對象名.__proto__=== 函數(shù)名.prototype
小結
自定義函數(shù).__proto__指向Function.prototypeObject.__proto__指向Function.prototype即Object.__proto__ === Function.prototype//trueFunction.__proto__指向Function.prototype:Function也是一個函數(shù),函數(shù)是一種對象,也有__proto__屬性。既然是函數(shù),那么它一定是被Function創(chuàng)建。所以Function是被自身創(chuàng)建的。所以它的__proto__指向了自身的Prototype。Function.prototype.__proto__===Object.prototype//trueObject.prototype的
__proto__指向的是null
總結
- 對象是函數(shù)創(chuàng)建的,而函數(shù)卻又是一種對象。也是屬性的集合
- 每個函數(shù)都有一個屬性叫做prototype。
- 對象的原型,指向構造函數(shù)的prototype屬性。
- prototype的屬性值是一個對象,默認的只有一個叫做constructor的屬性,指向這個函數(shù)本身。
- 原型既然作為對象,屬性的集合,可以自定義的增加許多屬性。
總之記住下面這幾個要點
- Object對象是由Function函數(shù)創(chuàng)建的
- 所有函數(shù)都是由Function創(chuàng)建的,函數(shù)也是對象
- 重要的公式
var 對象名 = new 函數(shù)名()對象名.__proto__=== 函數(shù)名.prototype
- 普通函數(shù)的prototype屬性值是一個對象
- Function.prototype有
__proto__這個屬性 -
Object.prototype.__proto__===null結果為true
