function Person(name, age) {
this.name = name
this.age = age
}
new Person('Flinn', 20)
// 在函數(shù)體里面實際會發(fā)生如下操作:
// var this = {}
// this.name = name
// this.age = age
// return undefined (被忽略)
// return this
Person('King', 22)
// 在函數(shù)體里面實際會發(fā)生如下操作:
// this.name = name (瀏覽器下,函數(shù)在window上下文被調(diào)用,所以this為window,所以window.name = 'King')
// this.age = age (瀏覽器下,函數(shù)在window上下文被調(diào)用,所以this為window,所以window.age = 22)
// return undefined
但是要注意:
如果一個函數(shù)的返回值是引用類型(數(shù)組,對象或者函數(shù))的數(shù)據(jù),那么這個函數(shù)作為構(gòu)造函數(shù)用new運算符執(zhí)行構(gòu)造時,運算的結(jié)果將被它的返回值取代,這時候,構(gòu)造函數(shù)體內(nèi)的this值丟失了,取而代之的是被返回的對象。
如果一個函數(shù)的返回值是一個值類型,那么這個函數(shù)作為構(gòu)造函數(shù)用new運算符執(zhí)行構(gòu)造時,它的返回值將被丟棄。new 表達式的結(jié)果仍然是this所引用的對象。