new Foo(...)
調(diào)用時會執(zhí)行以下步驟:
- 創(chuàng)建一個空的JavaScript對象秘狞,并繼承
Foo.prototype
var obj
obj.prototype = Object.create(Foo.prototype)
- 使用指定的參數(shù)調(diào)用構(gòu)造函數(shù)Foo晰赞,并將
this
綁定到新創(chuàng)建的對象谈秫。new Foo等價于new Foo()惕橙,即如果沒有指定參數(shù)列表雇庙,則調(diào)用Foo時沒有參數(shù)谓形。
Foo.call(obj, ...)
- 構(gòu)造函數(shù)返回的對象(不是null、false疆前、3.1415或其他基本類型)成為整個新表達(dá)式的結(jié)果寒跳。如果構(gòu)造函數(shù)沒有顯式返回對象,則使用步驟1中創(chuàng)建的對象竹椒。(通常構(gòu)造函數(shù)不返回值童太,但如果它們想覆蓋正常的對象創(chuàng)建過程,則可以選擇這樣做胸完。)
// 如果Foo沒有顯式返回對象
return obj
一言以蔽之书释,new一個對象就是創(chuàng)建一個新對象,這個新對象既擁有Foo
的constructor里的屬性赊窥,又繼承了Foo.prototype
爆惧,并返回這個新對象。
示例:
function Person(name) {
this.name = name
}
var a = new Person('Johnson')
console.log(Person.prototype.isPrototypeOf(a)) // true
console.log(a.constructor === Person) //true
console.log(a instanceof Person) // true
console.log(a.name) //Johnson
console.log(Object.prototype.toString.call(a)) // "[object Object]"