new Object()
構(gòu)造函數(shù)
>function Person() {
this.name = '小王'
this.age = 25
}
>var p = new Person()
構(gòu)造函數(shù)執(zhí)行的步驟:
1恩脂、創(chuàng)建一個(gè)空對(duì)象p机断。
var p = {}
2楷拳、執(zhí)行函數(shù)Person绣夺,并指定執(zhí)行環(huán)境對(duì)應(yīng)的this值為p。(執(zhí)行完畢后環(huán)境會(huì)銷毀)
Person.call(p)
3欢揖、p繼承了構(gòu)造函數(shù)Person()的原型
p.__proto__ = Person.prototype
4陶耍、執(zhí)行構(gòu)造函數(shù)內(nèi)的代碼
普通函數(shù)
>function person() {
return {
name: '小王',
age: 28
}
}
>var p = person()
來(lái)說(shuō)說(shuō)區(qū)別吧
1、表面:調(diào)用方式她混,是否用new調(diào)用烈钞;函數(shù)名,首字母是否大寫坤按。
2毯欣、this指向,構(gòu)造函數(shù)的this指向新建的對(duì)象晋涣。普通函數(shù)的this指向全局環(huán)境仪媒。
3、構(gòu)造函數(shù)默認(rèn)返回this,也就是實(shí)例對(duì)象谢鹊;普通函數(shù)要設(shè)置return,否則是undefined算吩。
一個(gè)問(wèn)題:如何知道我是普通函數(shù)還是構(gòu)造函數(shù)?
首先構(gòu)造函數(shù)必須用用new xx()佃扼,那那么調(diào)用會(huì)生成一個(gè)新對(duì)象偎巢,可以在構(gòu)造函數(shù)內(nèi)執(zhí)行:
// 如果返回true的話,說(shuō)明是構(gòu)造函數(shù)兼耀,否則就是普通函數(shù)压昼!
this instanceof xx(構(gòu)造函數(shù)名)
object.create()
Object.create = function (o) {
// 創(chuàng)造一個(gè)新匿名函數(shù)
var F = function () {};
// 給該匿名函數(shù)的原型指向o
F.prototype = o;
// 返回該匿名函數(shù)的實(shí)例
return new F();
};
我們平時(shí)創(chuàng)造對(duì)象 :
let a = {}
let a = new Object({})
區(qū)別:
創(chuàng)造了一個(gè)Object數(shù)據(jù)結(jié)構(gòu)的實(shí)例,Object.prototype上是有方法的瘤运。
我們自己創(chuàng)建一個(gè)數(shù)據(jù)結(jié)構(gòu)F窍霞,創(chuàng)造一個(gè)數(shù)據(jù)結(jié)構(gòu)的實(shí)例f。f.proto會(huì)指向F.prototype拯坟。F.prototype.proto指向Function.peototype但金,F(xiàn)unction.peototype.proto指向Object.prototype。
所以我們把自己創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)的prototype指向我們自己定義的對(duì)象郁季,可以切斷原本原型鏈冷溃。