js new到底干了什么,new的意義是什么?
一、學(xué)過JS的都知道 創(chuàng)建對(duì)象可以這樣
var obj=new Object();
var obj=new Function();
用內(nèi)置的函數(shù)對(duì)象來構(gòu)造對(duì)象
二丶還可以這樣自定義函數(shù)
function test(){}
var baby=new test();
于是這時(shí)候有了一個(gè)疑問
console.log(typeof test);//function 返回的是一個(gè)function類型
console.log(typeof baby);//object
為什么這樣捏?
那就是new 在搞事情唄,baby是object類型,那不就是說,后臺(tái)創(chuàng)建了一個(gè)對(duì)象并且賦給了baby
讓我們?cè)趖est函數(shù)里面加點(diǎn)佐料繼續(xù)驗(yàn)證
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吹牛逼說自己最帥!
//屬性和方法都添加到自動(dòng)創(chuàng)建的那個(gè)對(duì)象身上了
到現(xiàn)在為止new 干了三件事
var obj={};//創(chuàng)建一個(gè)對(duì)象
this.name=name;this.say=funcion(){return this.name+"吹牛逼說自己最帥!"};
在普通函數(shù)里面的this是window對(duì)象
所以得改變this指向來給obj添加屬性和方法 test.call(obj); 把test函數(shù)里面的this改變成obj
所以你this.name=name 不就是 obj.name=name; 這樣明白了吧!!
- 把obj的地址賦值給等式左邊的變量baby
接下來得需要原型鏈方面的知識(shí)了,我后續(xù)后寫原型鏈方面的知識(shí)。
function出來的函數(shù)會(huì)自動(dòng)添加一個(gè)prototype原型對(duì)象( 他上面的屬性和方法只有一份并且所有實(shí)例共享)
object對(duì)象都有內(nèi)置的原型對(duì)象proto(注意是兩個(gè)_我在這里吃過虧哈哈)
并且obj.proto指向它的構(gòu)造函數(shù)的prototype對(duì)象
obj.proto就是一個(gè)(地址)根據(jù)它可以找到它構(gòu)造函數(shù)的prototype對(duì)象
obj.proto=itsConstructor.prototype;//itsConstructor(它的構(gòu)造函數(shù)的意思)
這樣當(dāng)obj的里面沒有你想要的屬性和方法的時(shí)候,它會(huì)順著原型鏈一級(jí)一級(jí)向上查找,直到找到你想要的方法時(shí)或者為null時(shí)才停止
這里介紹下吧 如果不了解原型鏈這個(gè)東西會(huì)一臉懵逼吧
假設(shè) console.log(baby.run());
baby里是沒有run方法的
然后會(huì)根據(jù)baby.proto找到baby.prototype(依然沒有)
因?yàn)閜rototype也是對(duì)象(你們typeof一下就知道了)所以也有proto屬性
baby.prototype.proto----->找到了Object.prototype(依然沒有)
因?yàn)閜rototype是對(duì)象 當(dāng)然是Object構(gòu)造的了 Object.prototype是所有對(duì)象的祖先
Object.prototype.proto==null 到此為止原型鏈終止
讓我們給prototype對(duì)象添加一個(gè)方法,如果能使用就說明
baby.__proto__=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對(duì)象這個(gè)概念就知道怎么來的了
是在new的過程實(shí)現(xiàn)的
所以綜上所述
new 干了四件事
1.var obj={};
2.obj.__proto__=test.prototype;
3.test.call(obj);
4.把obj的地址賦值給等式左邊的變量
我認(rèn)為new的意義在于節(jié)省代碼,相當(dāng)于語法糖,還有就是它可以擁使用構(gòu)造函數(shù)里面的所有屬性和方法
并且還可以擴(kuò)展。