基礎(chǔ):
只有構(gòu)造函數(shù)有原型屬性 - prototype店乐,它是一個(gè)對(duì)象
原型對(duì)象中有個(gè)constructor屬性,constructor指向構(gòu)造函數(shù)本身澜驮,也只有原型對(duì)象具有constructor屬性
所有的對(duì)象都有 __protp__屬性,它也是個(gè)對(duì)象
1.構(gòu)造函數(shù)
// 構(gòu)造函數(shù)
function Student(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
// 多個(gè)對(duì)象,會(huì)存儲(chǔ)多個(gè)sayHi方法
this.sayHi = function () {
console.log('大家好释树,我是' + this.name);
}
}
var s1 = new Student('lilei', 18, '男');
var s2 = new Student('hmm', 18, '女');
s1.sayHi();
s2.sayHi();
console.log(s1.sayHi === s2.sayHi); // false 兩個(gè)獨(dú)立的sayHi方法
我們可以通過(guò)構(gòu)造函數(shù)批量創(chuàng)建具有相同屬性的對(duì)象,但當(dāng)構(gòu)造函數(shù)內(nèi)有靜態(tài)方法的時(shí)候,每創(chuàng)建一個(gè)實(shí)例都會(huì)為靜態(tài)方法在內(nèi)存中開(kāi)辟一塊空間奢啥,而這些方法都是一樣的署浩,浪費(fèi)內(nèi)存。
解決方案是將靜態(tài)方法放在構(gòu)造函數(shù)的原型prototype上扫尺,構(gòu)造函數(shù)的原型不會(huì)被實(shí)例拷貝筋栋,所有的實(shí)例對(duì)象都可以訪問(wèn)構(gòu)造函數(shù)的原型,這樣節(jié)省了內(nèi)存空間正驻。
function Student(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
Student.prototype.sayHi = function () {
console.log('大家好弊攘,我是' + this.name);
}
// 通過(guò)Student構(gòu)造函數(shù),創(chuàng)建的對(duì)象姑曙,可以訪問(wèn)Student.prototype中的成員
var s1 = new Student('lilei', 18, '男');
var s2 = new Student('hmm', 18, '女');
s1.sayHi();
s2.sayHi();
console.log(s1.sayHi === s2.sayHi);// true
2.原型鏈
把構(gòu)造函數(shù)襟交、構(gòu)造函數(shù)的原型、構(gòu)造函數(shù)的實(shí)例之前的關(guān)系成為原型鏈
3.查找規(guī)則
實(shí)例對(duì)象訪問(wèn)一個(gè)方法或者屬性的步驟
1.在本身對(duì)象內(nèi)查找
2.通過(guò)__proto__
訪問(wèn)構(gòu)造函數(shù)的原型prototype內(nèi)查找
3.通過(guò)構(gòu)造函數(shù)的原型prototype內(nèi)的__proto__
訪問(wèn)Object構(gòu)造函數(shù)的原型prototype查找伤靠,結(jié)果是 null