1. 程式人生 > >JavaScript中new了一個對象,發生了什麽?

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

das script nis 強調 asc rip 操作 category turn

JavaScript一直強調沒有類的概念,但是JavaScript中我們也經常需要new一個對象。

new是一個運算符,用來調用函數(js中函數可以作為普通函數被調用做方法,也可以通過new來調用作為一個構造器)

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

let p = new Person(‘Jay‘)

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

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

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

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

let obj1 = {}

let obj2 = new Object()

那麽在原型鏈中的操作:

let sport = {
    category: ‘ball‘    
}

function Tennis(){}

Tennis.prototype = sport

let t = new Tennis()

主要步驟有兩點:

  • 克隆一個 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    
}

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