一.理解JS對象實現的基礎:函數
構造函數:函的得另外一種方式,執行後建立對象,並建立原型對象。this
原型鏈:對象訪問構造函數的指針。spa
Function函數:函數對象,全部底層程序都要調用的函數。本身定義的構造函數,普通函數都是Function函數的子對象。prototype
Object函數:全部建立對象的祖輩對象,是Function對象的祖輩,也是由Function對象實現的。指針
二. 構造函數對象
1.構造函數的聲明方式與普通函數徹底一致,但調用方式不一樣,返回的 結果 及 內存 結構也不一樣,執行構造函數將會返回一個該構造函數對應的對象。內存
//構造函數 函數首字母大寫 原型鏈
//在函數體中與普通函數相比 this指針不一樣原型
//與普通函數相比,調用方式不一樣 new Fun();---構造函數io
//構造函數通常用做建立一個類,實現相似類的功能,在JAVA中類名的編寫規範,首字母大寫,所以遵循這個規範首字母大寫----讓別人識別 以大寫開頭,要 以構造函數方式調用
function Fun(){
}
Fun(); //普通函數調用方式
var fun = new Fun(); //構造函數的調用方式 --初始化一個構造函數
2. new Fun() 的執行過程
1.建立了一個空對象obj.
2.空對象空對象原型鏈(_proto_)指向了函數對象 prototype對象。
3.修改對象的this指針名爲對象建立新的對象引用。
4.執行函數體
在new Function時建立了一個函數對象, 同時建立了一個原型對象
Fun函數對象{
prototype:地址: 訪問 Fun的 prototype對象
}
Fun的 prototype對象{ //函數原型對象
constructor:
__proto__: //原型鏈
}
prototype是一個最簡單的對象
普通對象沒有 prototype對象
new 了一個Fun 建立了一個空對象,對象內有一個屬性
{
__proto__:地址
}
3.修改對象的this指針名爲對象建立新的對象引用。
普通函數調用時
function Fun(){
var that1= this; //必須先引用才能給函數中 this 賦值,不然 this值爲 undefined
}
Fun(); //普通函數調用方式
普通函數調用此時 this :window對象--運行環境對象
this在其餘語言中,表明當前對象,但在js中很是靈活--六種規則
1. this 是跟當前函數的運行環境有關
對於普通函數來講:在函數體中 this 表明調用當前函數的運行環境對象 Fun(); 至關因而最外層window調用的 this指window
function Fun(){
var that1 =this;
innerFun( );
function innerFun(){ 短暫時間內 innerFun()在棧內存
var that2 = this; that2 : window
}
}
按理說 innerFun( )在 Fun()中調用--this 應當指的是Fun() 但錯誤
js的運行過程致使--
預編譯 Fun() ;做爲全局函數保存在對象中
Fun() ;隸屬於window 對象, window對象爲Fun()的運行環境,this 指向 window 對象
運行到--調用 innerFun();已經在內存中,在 window全局對象中,在執行到 innerFun(),這個短暫的時間內, innerFun( ) ; 被加載到棧內存,其具體的函數對象在堆內存, 棧內存隸屬於window對象的執行環境
this 指針指向 window 對象。
Fun()函數做爲普通對象,能夠給他賦屬性, 定義函數
Fun.userName = "Amy";
例
function Fun(){
var that1 = this;
function innerFun (){
var that2 = this;
}
}
Fun.userName = "zhansan";
Fun.innerFun2 = function(){ //綁定在函數對象身上
var that3 = this; // this :Fun( ); 指向當前函數對象
}
Fun.innerFun2() //普通函數調用
綠色部分在預編譯時,沒有進行---開始運行後逐個添加userName屬性 ,innerFun2函數----由Fun 調用
innerFun2
4 . 對於構造函數來講,this 不是window對象。this 表明當前 fun 對象 , 運行後 fun 對象中生成 屬性 id :1 name :adame , 在構造函數中this指向發生問題。
普通函數中,this 表明 當前運行環境 誰調用 this 就指向誰。
在構造函數中 --用構造函數方式調用 Fun( ) ;這時 this 至關於你定義的接受變量,至關於給 fun裏面加 Id 、name
function Fun(){
this.id = 1;
this.name = "adame"
}
//用構造函數運行
var fun = new Fun()
4.前三步執行完了,執行函數體
普通函數沒有前三部。