0.引言:對象引用的原理:
首先贪庙,我們知道,創(chuàng)建對象有兩種方法:
1翰苫、字面量直接創(chuàng)建止邮。 2、構(gòu)造函數(shù)法創(chuàng)建對象奏窑。 其中添坊,構(gòu)造函數(shù)法創(chuàng)建對象有些東西跟大家分享。
要搞清楚構(gòu)造函數(shù)創(chuàng)建對象的原理狡孔,才不至于掉進(jìn)坑里
創(chuàng)建對象的步驟應(yīng)該都知道:
1.在內(nèi)存堆區(qū)開辟空間矗钟,創(chuàng)建新對象
2.this 指向新創(chuàng)建的對象
3.執(zhí)行函數(shù)體,給對象添加屬性
4.返回新創(chuàng)建的對象地址
setp1.
首先看一張圖筑凫,搞清楚我們創(chuàng)建的對象是如何在內(nèi)存中存在的
寫代碼:
<script type="text/javascript">
function Person () {
this.name = "小雪";
}
var person1 = new Person();
很明顯滑沧,堆區(qū)中是存儲構(gòu)造函數(shù)本體的區(qū)域并村,創(chuàng)建時第一步就是在堆區(qū)中開辟一片內(nèi)存空間來存放新創(chuàng)建的實(shí)例對象
setp2
this 指針指向和添加豎向暫且不表,直接到最后一步滓技,將變量名賦值給構(gòu)造函數(shù)哩牍,該變量名保存在棧區(qū)。
注意:這里不能再叫賦值了令漂,要叫引用膝昆,將變量名的指針指向該構(gòu)造函數(shù)
再來一張圖
雖然我們管實(shí)例出來的對象就叫 person1 但是 person1 只是一個代號,真正干活的是 new Person 叠必,就像一個人的人名一樣荚孵,你叫張三去買水,張三只是個這個人的名字纬朝,真正去買水的是張三這個人
同理可得收叶,一個人可以改名,只要他還是他就行
再創(chuàng)建幾個區(qū)別一下
<script type="text/javascript">
function Person () {
this.name = "小雪";
}
var person1 = new Person();
var person2 = new Person();
// console.log(new Person().name);
// console.log(new Person().name);
var person3 = person2;
看看有幾個到底有幾個人
console.log(person1 === person2);//false
console.log(person1 === person3);//false
console.log(person2 === person3);//true
能看出來一些問題共苛,person2 與 person3 完全相同判没,也就是說,一共只有兩個人隅茎,不過第二個人有兩個名 person2 和 person3
再來一張圖看看現(xiàn)在的情況
就是這么個意思
現(xiàn)在來修改person3
person3.name = "小黑";
console.log(person1.name);//小雪
console.log(person2.name);//小黑
console.log(person3.name);//小黑
console.log("-----------");
person2 與 person3 的 name 都變成了小黑澄峰,原因就是他倆就是一個人,只不過是名字不同辟犀,用術(shù)語來說俏竞,就是這兩個變量名指向了同一個對象
再修改一下person3 的指向
person3 = new Person();
console.log(person1.name);//小雪
console.log(person2.name);//小黑
console.log(person3.name);//小雪
console.log("-----------");
這也不難理解,因?yàn)閜erson3 現(xiàn)在是第三個人的名字了堂竟,所以第三個人的初始值就是person3 的 name 值
還有圖
現(xiàn)在是三個人
再修改 person1 的指向
person1 = person2;
console.log(person1.name);//小黑
console.log(person2.name);//小黑
console.log(person3.name);//小雪
現(xiàn)在第一個人沒了魂毁,第二個人有兩個名字 person1 和 person2
行了,很清晰 沒毛苍镜贰漱牵!