JavaScript中new了一個對象,發生了什麼?

JavaScript一直強調沒有類的概念,可是JavaScript中咱們也常常須要new一個對象。函數

new是一個運算符,用來調用函數(js中函數能夠做爲普通函數被調用作方法,也能夠經過new來調用做爲一個構造器)this

function Person(name){
  this.name = name  
}

let p = new Person('Jay')

其實,在JavaScript中任何對象經過構造器(例如Person)的建立。其實是克隆了一個Object.prototype空對象(js根對象)。spa

克隆一個Object.prototype對象後,初始化將新對象的原型指向Object.prototype。prototype

事實上,除了根對象Object.prototype。任何一個對象都有一個原型。code

像下面這樣常見的建立對象方式,在JavaScript引擎內部,都是進行一樣的操做 —— 克隆對象

let obj1 = {}

let obj2 = new Object()

那麼在原型鏈中的操做:blog

let sport = {
    category: 'ball'    
}

function Tennis(){}

Tennis.prototype = sport

let t = new Tennis()

主要步驟有兩點:ip

  • 克隆一個 js 的 Object.prototype 對象 t
  • 將 t 的原型指向它的構造器(Tennis)原型,sport —— " t.__proto__ = Tennis.prototype "

最後補充一點,構造器函數中有兩句語句被隱式執行了,上面的Tennis中原型鏈

function Tennis(){
    let this = {
        __proto__: Tennis.prototype
    }
    // .....
    // let this.xxx = xxx
    // .....
    return this    
}
相關文章
相關標籤/搜索