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 }