怎么創(chuàng)建一個對象?
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 + "會唱歌");
}
}
var lhd = new Star("劉德華的哥哥", 19)
```
構(gòu)造函數(shù)創(chuàng)建實例對象的時候,每個實例對象都會開辟一個新的額內(nèi)存空間存sing方法,但是這些方法都是一樣的,就造成了內(nèi)存空間的浪費。所以引入了prorotype存這個相同的方法。
prorotype
JavaScript 規(guī)定,每一個構(gòu)造函數(shù)都有一個prototype 屬性,指向另一個對象。注意這個prototype就是一個對象,這個對象的所有屬性和方法,都會被構(gòu)造函數(shù)所擁有。我們可以把那些不變的方法,直接定義在 prototype 對象上,這樣所有對象的實例就可以共享這些方法。
proto
對象原型,對象都會有一個屬性 __proto__ 指向構(gòu)造函數(shù)的 prototype 原型對象,是系統(tǒng)自動添加的。
__proto__對象原型和原型對象 prototype 是等價的
__proto__對象原型的意義就在于為對象的查找機制提供一個方向,或者說一條路線,但是它是一個非標準屬性,因此實際開發(fā)中,不可以使用這個屬性,它只是內(nèi)部指向原型對象 prototype。

img2.png
constructor構(gòu)造函數(shù)
對象原型( __proto__)和構(gòu)造函數(shù)(prototype)原型對象里面都有一個屬性 constructor 屬性 ,constructor 我們稱為構(gòu)造函數(shù),因為它指回構(gòu)造函數(shù)本身。
constructor 主要用于記錄該對象引用于哪個構(gòu)造函數(shù),它可以讓原型對象重新指向原來的構(gòu)造函數(shù)。如果我們修改了原來的原型對象,給原型對象賦值的是一個對象,則必須手動的利用constructor指回原來的構(gòu)造函數(shù)如:
function Star(uname, age) {
this.uname = uname;
this.age = age;
}
// 很多情況下,我們需要手動的利用constructor 這個屬性指回 原來的構(gòu)造函數(shù)
Star.prototype = {
// 如果我們修改了原來的原型對象,給原型對象賦值的是一個對象,則必須手動的利用constructor指回原來的構(gòu)造函數(shù)
constructor: Star, // 手動設(shè)置指回原來的構(gòu)造函數(shù)
sing: function() {
console.log('我會唱歌');
},
movie: function() {
console.log('我會演電影');
}
}
var zxy = new Star('張學友', 19);
console.log(zxy)
原型鏈
每一個實例對象又有一個__proto__屬性,指向的構(gòu)造函數(shù)的原型對象,構(gòu)造函數(shù)的原型對象也是一個對象,也有__proto__屬性,這樣一層一層往上找就形成了原型鏈。

img5.png