1. 程式人生 > >js new到底幹了什麽,new的意義是什麽?

js new到底幹了什麽,new的意義是什麽?

是什麽 擴展 那不 意義 類型 nbsp 自動添加 正在 原型

學過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的意義是什麽?