JavaScript的數據類型能夠分爲基本數據類型和引用數據類型。編程
基本數據類型(6種)函數
引用數據類型this
構造函數spa
構造函數就是一個普通的函數,爲了與普通函數區別,構造函數名字的第一個字母一般大寫。prototype
構造函數的特色有兩個。code
- 函數體內部使用了this關鍵字,表明了所要生成的對象實例。
- 使用new命令生成對象。
2. new命令
new命令的做用,就是執行構造函數,返回一個實例對象。對象
new 命令的原理blog
若是構造函數內部有return語句,並且return後面跟着一個對象,new命令會返回return語句指定的對象;不然,返回this對象。ip
var Fn=function(){ this.name='xxx'; this.old=18; } var f1=new Fn(); console.log(f1.name);//xxx console.log(f1.old);//18
上面代碼經過new命令,讓構造函數Fn生成一個實例對象,保存在變量f1中。這個新生成的實例對象,從構造函數Fn獲得了name和old屬性。new命令執行時,構造函數內部的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
對象是函數建立的,而函數卻又是一種對象。也是屬性的集合,能夠對函數進行自定義屬性。
每一個函數都有一個屬性叫作prototype。
這個prototype的屬性值是一個對象,默認的只有一個叫作constructor的屬性,指向這個函數自己。
var Fn=function(){ this.name='xxx'; this.old=18; }
回到上面new命令的原理的第二條,從這張圖能夠看到對象的原型,指向構造函數的prototype屬性。
f1.__proto__
指向構造函數的prototype屬性,就是對象的原型。因此f1.__proto__===Fn.prototype爲true
prototype的屬性值是一個對象,默認的只有一個叫作constructor的屬性,指向這個函數自己。
左邊爲Fn函數,右邊就是它的原型
在上面能夠看到f1.__proto__===Fn.prototype
的結果爲true
__proto__
就是指向構造函數的prototype屬性,Fn.prototype
就是對象的原型
即,每一個由構造函數建立的對象都有一個__proto__屬性,指向建立該對象的函數的prototype。
基於以上,咱們獲得一個重要的公式
var 對象名 = new 函數名()
對象名.__proto__=== 函數名.prototype
小結
自定義函數.__proto__指向Function.prototype
Object.__proto__指向Function.prototype
即Object.__proto__ === Function.prototype//true
Function.__proto__指向Function.prototype
:Function也是一個函數,函數是一種對象,也有__proto__
屬性。既然是函數,那麼它必定是被Function建立。因此Function是被自身建立的。因此它的__proto__
指向了自身的Prototype。Function.prototype.__proto__===Object.prototype//true
__proto__指
向的是null總之記住下面這幾個要點
重要的公式
var 對象名 = new 函數名()
對象名.__proto__=== 函數名.prototype
__proto__
這個屬性Object.prototype.__proto__===null
結果爲true