怎么創(chuàng)建一個(gè)對(duì)象眼滤?
1.字面量的方式
`var obj = {}`
2.new方式
`var obj = new Object()`
3.構(gòu)造函數(shù)的方式
```
function Star(uname, age) {
this.uname = uname,
this.age = age,
this.sing = function() {
console.log(this.uname + "會(huì)唱歌");
}
}
var lhd = new Star("劉德華的哥哥", 19)
```
構(gòu)造函數(shù)創(chuàng)建實(shí)例對(duì)象的時(shí)候,每個(gè)實(shí)例對(duì)象都會(huì)開(kāi)辟一個(gè)新的額內(nèi)存空間存sing方法历涝,但是這些方法都是一樣的诅需,就造成了內(nèi)存空間的浪費(fèi)。所以引入了prorotype存這個(gè)相同的方法睬关。
prorotype
JavaScript 規(guī)定诱担,每一個(gè)構(gòu)造函數(shù)都有一個(gè)prototype 屬性,指向另一個(gè)對(duì)象电爹。注意這個(gè)prototype就是一個(gè)對(duì)象蔫仙,這個(gè)對(duì)象的所有屬性和方法,都會(huì)被構(gòu)造函數(shù)所擁有丐箩。我們可以把那些不變的方法摇邦,直接定義在 prototype 對(duì)象上,這樣所有對(duì)象的實(shí)例就可以共享這些方法屎勘。
proto
對(duì)象原型施籍,對(duì)象都會(huì)有一個(gè)屬性 __proto__ 指向構(gòu)造函數(shù)的 prototype 原型對(duì)象,是系統(tǒng)自動(dòng)添加的概漱。
__proto__對(duì)象原型和原型對(duì)象 prototype 是等價(jià)的
__proto__對(duì)象原型的意義就在于為對(duì)象的查找機(jī)制提供一個(gè)方向丑慎,或者說(shuō)一條路線,但是它是一個(gè)非標(biāo)準(zhǔn)屬性瓤摧,因此實(shí)際開(kāi)發(fā)中竿裂,不可以使用這個(gè)屬性,它只是內(nèi)部指向原型對(duì)象 prototype照弥。
img2.png
constructor構(gòu)造函數(shù)
對(duì)象原型( __proto__)和構(gòu)造函數(shù)(prototype)原型對(duì)象里面都有一個(gè)屬性 constructor 屬性 腻异,constructor 我們稱為構(gòu)造函數(shù),因?yàn)樗富貥?gòu)造函數(shù)本身这揣。
constructor 主要用于記錄該對(duì)象引用于哪個(gè)構(gòu)造函數(shù)悔常,它可以讓原型對(duì)象重新指向原來(lái)的構(gòu)造函數(shù)影斑。如果我們修改了原來(lái)的原型對(duì)象,給原型對(duì)象賦值的是一個(gè)對(duì)象,則必須手動(dòng)的利用constructor指回原來(lái)的構(gòu)造函數(shù)如:
function Star(uname, age) {
this.uname = uname;
this.age = age;
}
// 很多情況下,我們需要手動(dòng)的利用constructor 這個(gè)屬性指回 原來(lái)的構(gòu)造函數(shù)
Star.prototype = {
// 如果我們修改了原來(lái)的原型對(duì)象,給原型對(duì)象賦值的是一個(gè)對(duì)象,則必須手動(dòng)的利用constructor指回原來(lái)的構(gòu)造函數(shù)
constructor: Star, // 手動(dòng)設(shè)置指回原來(lái)的構(gòu)造函數(shù)
sing: function() {
console.log('我會(huì)唱歌');
},
movie: function() {
console.log('我會(huì)演電影');
}
}
var zxy = new Star('張學(xué)友', 19);
console.log(zxy)
原型鏈
每一個(gè)實(shí)例對(duì)象又有一個(gè)__proto__屬性,指向的構(gòu)造函數(shù)的原型對(duì)象机打,構(gòu)造函數(shù)的原型對(duì)象也是一個(gè)對(duì)象矫户,也有__proto__屬性,這樣一層一層往上找就形成了原型鏈姐帚。
img5.png