js new到底幹了什麽,new的意義是什麽?
學過JS的都知道 創建對象可以這樣
var obj=new Object();
var obj=new Function();
用內置的函數對象來構造對象
還可以這樣自定義函數
function test(){}
var baby=new test();
於是這時候有了一個疑問
console.log(typeof test);//function
返回的是一個function類型
console.log(typeof baby);//object
為什麽這樣捏?
那就是new 在搞事情唄,baby是object類型,那不就是說,它裏面創建了一個對象並且返回了
讓我們在test函數裏面加點佐料繼續驗證
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吹牛逼說自己最帥!
//屬性和方法都添加到自動創建的那個對象身上了
到現在為止new 幹了三件事
1.var obj={};//創建一個對象
2.this.name=name;this.say=funcion(){return this.name+"吹牛逼說自己最帥!"};
在普通函數裏面的this是window對象
所以得改變this指向來給obj添加屬性和方法 test.call(obj); 吧test函數裏面的this改變成obj
所以你this.name=name 不就是 obj.name=name; 這樣明白了吧!!
3 把obj的地址賦值給等式左邊的變量
接下來得需要原型鏈方面的知識了,我後續後寫原型鏈方面的知識。
1.function出來的函數會自動添加一個prototype原型對象( 他上面的屬性和方法只有一份並且所有實例共享)
2.object對象都有內置的原型對象__proto__註意是兩個_(我在這裏吃過虧哈哈)
3.並且obj.__proto__指向它的構造函數的prototype對象
4.obj.__proto__就是一個(地址)根據它可以找到它構造函數的prototype對象
obj.__proto__=itsConstructor.prototype;//itsConstructor(它的構造函數的意思)
5.這樣當obj的裏面沒有你想要的屬性和方法的時候,它會順著原型鏈一級一級向上查找,直到找到你想要的方法時或者為null時才停止
6這裏介紹下吧 如果不了解原型鏈這個東西會一臉懵逼吧
假設 console.log(baby.run());
baby裏是沒有run方法的
然後會根據baby.__proto__找到baby.prototype(依然沒有)
因為prototype也是對象(你們typeof一下就知道了)所以也有__proto__屬性
baby.prototype.__proto__----->找到了Object.prototype(依然沒有)
因為prototype是對象 當然是Object構造的了 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__指向它的構造函數的prototype對象這個概念就知道怎麽來的了
實在new的過程實現的
所以綜上所述
new 幹了四件事
1.var obj={};
2.obj.__proto__=test.prototype;
3.test.call(obj);
4把obj的地址賦值給等式左邊的變量
我認為new的意義在於節省代碼,相當於語法糖,還有就是它可以擁使用構造函數裏面的所有屬性和方法
並且還可以擴展。
也不知道看了的人能不能明白。。。你得看原型和原型鏈 要不不會很理解的
this和作用域也可以看看
js new到底幹了什麽,new的意義是什麽?