javascript對象---2 構造函數

一.理解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.前三步執行完了,執行函數體

普通函數沒有前三部。

相關文章
相關標籤/搜索