new()做了什么

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 干了三件事
  1. var obj={};//創(chuàng)建一個(gè)對(duì)象

  2. 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; 這樣明白了吧!!

  1. 把obj的地址賦值給等式左邊的變量baby
接下來得需要原型鏈方面的知識(shí)了,我后續(xù)后寫原型鏈方面的知識(shí)。
  1. function出來的函數(shù)會(huì)自動(dòng)添加一個(gè)prototype原型對(duì)象( 他上面的屬性和方法只有一份并且所有實(shí)例共享)

  2. object對(duì)象都有內(nèi)置的原型對(duì)象proto(注意是兩個(gè)_我在這里吃過虧哈哈)

  3. 并且obj.proto指向它的構(gòu)造函數(shù)的prototype對(duì)象

  4. obj.proto就是一個(gè)(地址)根據(jù)它可以找到它構(gòu)造函數(shù)的prototype對(duì)象

obj.proto=itsConstructor.prototype;//itsConstructor(它的構(gòu)造函數(shù)的意思)

  1. 這樣當(dāng)obj的里面沒有你想要的屬性和方法的時(shí)候,它會(huì)順著原型鏈一級(jí)一級(jí)向上查找,直到找到你想要的方法時(shí)或者為null時(shí)才停止

  2. 這里介紹下吧 如果不了解原型鏈這個(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ò)展。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容