轉(zhuǎn)載自 https://www.cnblogs.com/liveoutfun/p/8735992.html
學過JS的都知道 創(chuàng)建對象可以這樣
var obj=new Object();
var obj=new Function();
用內(nèi)置的函數(shù)對象來構(gòu)造對象
還可以這樣自定義函數(shù)
function test(){}
var baby=new test();
于是這時候有了一個疑問
console.log(typeof test);//function
返回的是一個function類型
console.log(typeof baby);//object
為什么這樣捏唤衫?
那就是new 在搞事情唄,baby是object類型婆赠,那不就是說,后臺創(chuàng)建了一個對象并且賦給了baby
讓我們在test函數(shù)里面加點佐料繼續(xù)驗證
function test(name){
this.name=name;
this.say=function(){
return this.name+"吹牛逼說自己最帥"佳励!
}
}
var baby=new test("xjz");
console.log(baby.name);//xjz
console.log(baby.say());//xjz吹牛逼說自己最帥休里!
//屬性和方法都添加到自動創(chuàng)建的那個對象身上了
到現(xiàn)在為止new 干了三件事
1.var obj={};//創(chuàng)建一個對象
2.this.name=name;this.say=funcion(){return this.name+"吹牛逼說自己最帥!"};
在普通函數(shù)里面的this是window對象
所以得改變this指向來給obj添加屬性和方法 test.call(obj); 吧test函數(shù)里面的this改變成obj
所以你this.name=name 不就是 obj.name=name; 這樣明白了吧G臁!
3 把obj的地址賦值給等式左邊的變量
接下來得需要原型鏈方面的知識了妙黍,我后續(xù)后寫原型鏈方面的知識悴侵。
1.function出來的函數(shù)會自動添加一個prototype原型對象( 他上面的屬性和方法只有一份并且所有實例共享)
2.object對象都有內(nèi)置的原型對象proto注意是兩個_(我在這里吃過虧哈哈)
3.并且obj.proto指向它的構(gòu)造函數(shù)的prototype對象
4.obj.proto就是一個(地址)根據(jù)它可以找到它構(gòu)造函數(shù)的prototype對象
obj.proto=itsConstructor.prototype;//itsConstructor(它的構(gòu)造函數(shù)的意思)
5.這樣當obj的里面沒有你想要的屬性和方法的時候,它會順著原型鏈一級一級向上查找拭嫁,直到找到你想要的方法時或者為null時才停止
6這里介紹下吧 如果不了解原型鏈這個東西會一臉懵逼吧
假設(shè) console.log(baby.run());
baby里是沒有run方法的
然后會根據(jù)baby.proto找到baby.prototype(依然沒有)
因為prototype也是對象(你們typeof一下就知道了)所以也有proto屬性
baby.prototype.proto----->找到了Object.prototype(依然沒有)
因為prototype是對象 當然是Object構(gòu)造的了 Object.prototype是所有對象的祖先
Object.prototype.proto==null 到此為止原型鏈終止
讓我們給prototype對象添加一個方法畜挨,如果能使用就說明baby.proro=test.prototype;
test.prototype.look=function(){
return this.name+"正在看美女!";
}
console.log(baby.look());//xjz正在看美女 成功訪問到了
于是乎 new 很神奇的就干了這件事
obj.proto=test.prototype;
于是那句話obj.proto指向它的構(gòu)造函數(shù)的prototype對象這個概念就知道怎么來的了
實在new的過程實現(xiàn)的
所以綜上所述
new 干了四件事
1.var obj={};
2.obj.proto=test.prototype;
3.test.call(obj);
4把obj的地址賦值給等式左邊的變量
我認為new的意義在于節(jié)省代碼噩凹,相當于語法糖,還有就是它可以擁使用構(gòu)造函數(shù)里面的所有屬性和方法
并且還可以擴展毡咏。
也不知道看了的人能不能明白驮宴。。呕缭。你得看原型和原型鏈 要不不會很理解的
this和作用域也可以看看