一篱昔、創(chuàng)建對(duì)象的方法
閱讀犀牛書(shū)(《javascript權(quán)威指南》)矢赁,書(shū)中將js創(chuàng)建對(duì)象的方法分為四種搁嗓,對(duì)象字面量、構(gòu)造函數(shù)缰犁、原型、Object.create()怖糊。
1帅容、對(duì)象字面量:
需要修改屬性只能在對(duì)象上修改
var t1 = {x: 1};//也可以寫(xiě)作var t1 = new Object({x: 1});
2、構(gòu)造函數(shù)
需要修改屬性也只能在對(duì)象上修改伍伤,在對(duì)象上的修改不會(huì)影響到構(gòu)造器
function f2(){
this.x = 1;
};
var t2 = new f2();//t2創(chuàng)建后并徘,t2的屬性不受f2的影響
3、原型
可以通過(guò)修改構(gòu)造器prototype
的值扰魂,修改對(duì)象的值麦乞,但是如果對(duì)象上的屬性重新賦值了蕴茴,則在對(duì)象上獲取的值是重新賦值的值,而不是構(gòu)造器prototype
的值
function f3(){};
var t3 = new f3();
f3.prototype.x = 1;//如果重新給f3.prototype.x賦值姐直,t3.x也會(huì)隨之改變
t3.x = 3; //改t3的值重新賦值之后t3.x不會(huì)隨f3.prototype.x改變
4倦淀、Object.create()
可以通過(guò)修改父對(duì)象的值修改對(duì)象的值,重新賦值則無(wú)法修改
var f4 = {x: 1};
var t4 = Object.create(f4);//如果f4的屬性改變声畏,t4相應(yīng)的屬性也會(huì)改變
二撞叽、創(chuàng)建的對(duì)象的本質(zhì)
以上四種方法看似不同,但他們的本質(zhì)是一樣的砰识,都是通過(guò)最基本的new Object()
與原型來(lái)實(shí)現(xiàn)對(duì)象的創(chuàng)建的能扒。
使用構(gòu)造器創(chuàng)建對(duì)象,其本質(zhì)如下:
對(duì)象的
__proto__
指向了構(gòu)造器的prototype
辫狼,所以修改構(gòu)造器的屬性不會(huì)影響對(duì)象初斑,但是修改構(gòu)造器原型會(huì)。使用
Object.create()
:
對(duì)象的
__proto__
指向了構(gòu)造器膨处,所以可以通過(guò)修改父對(duì)象影響對(duì)象的屬性
三见秤、__proto__
與prototype
__proto__
和prototype
是比較容易混淆的兩個(gè)屬性。__proto__
是對(duì)象的屬性真椿,用來(lái)在原型鏈上查找你需要的方法的實(shí)際對(duì)象鹃答。prototype
是函數(shù)獨(dú)有的屬性當(dāng)我們使用關(guān)鍵詞new
并且將函數(shù)作為構(gòu)造函數(shù)來(lái)構(gòu)造對(duì)象的時(shí)候, 它被用來(lái)構(gòu)建對(duì)象的__proto__
屬性.
對(duì)于非函數(shù)的對(duì)象來(lái)說(shuō)比較簡(jiǎn)單只有__proto__
,但是函數(shù)也是對(duì)象突硝,所以在函數(shù)中__proto__
和prototype
同時(shí)存在测摔,一個(gè)函數(shù)作為構(gòu)造器時(shí),參與其中的是prototype
屬性解恰,但是被創(chuàng)建時(shí)锋八,__proto__
指向了Function.prototype
。