成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

第三期:基于紅皮書「創(chuàng)建js對(duì)象的6種方法」再討論(1)

liaoyg8023 / 1502人閱讀

摘要:構(gòu)造函數(shù)里的作用在的時(shí)候,所謂的作用域賦給新對(duì)象,就是使用了方法。如果我們不用,也可以實(shí)現(xiàn)指向我們想指向的對(duì)象構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,這些變式其實(shí)都是在充分了解和的用法后,自然寫出來(lái)的。

這一期所書寫的目的并不是為了介紹創(chuàng)建對(duì)象的方法,在紅皮書里面,例子其實(shí)很清楚。在這篇文章中,想討論一下書中細(xì)節(jié),并沒(méi)有解釋太清楚的地方。

工廠模式
//工廠模式書本「
function createPerson(name,age){
    var obj=new Object();
    obj.name=name;
    obj.age=age;
    obj.load=function(){
        console.log(obj.name,obj.age);
    }
    return obj;
}

var toti=createPerson("toti",18);
toti.load();
//」工廠模式書本

工廠模式的一些要點(diǎn):

解決:

創(chuàng)建多個(gè)相似對(duì)象問(wèn)題

傳參

缺點(diǎn):不能識(shí)別對(duì)象類型

優(yōu)化:一般使用對(duì)象字面量寫法,再返回

思考

對(duì)象暴露出來(lái),其實(shí)也可以用,但是賦值需要重復(fù)。

包在一個(gè)函數(shù)里面,傳參方便

這個(gè)模式做了什么?

創(chuàng)建一個(gè)Object實(shí)例對(duì)象

為實(shí)例obj添加屬性、方法

返回實(shí)例obj

相當(dāng)于使用了一個(gè)普通的函數(shù),去讓這個(gè)對(duì)象可以復(fù)用。

書中:「不能識(shí)別對(duì)象類型」如何理解?

我們的實(shí)例,當(dāng)我們?nèi)onsole.log(toti)的時(shí)候。但是工廠模式下,

我們?nèi)カ@取這個(gè)實(shí)例的時(shí)候,只能簡(jiǎn)單的判斷它是一個(gè)對(duì)象。這就是它一個(gè)缺點(diǎn),于是我們有了后面的構(gòu)造函數(shù)模式

使用對(duì)象字面量寫法優(yōu)化

//工廠模式對(duì)象字面量「
function createPerson(name,age){
    var obj={
        name:name,
        age:age,
        load:function(){
            console.log(this.name,this.age);
        }
    }
    return obj;
}

var mary=createPerson("mary",18);
mary.load();
//」工廠模式對(duì)象字面量

對(duì)象字面量注意問(wèn)題

this的用法

在obj對(duì)象里面,this.name&this.age指向obj的作用域的name&age

如果不使用this,則name和age,指向createPerson的作用域。

在本例中,使用this.name,name都可以,因?yàn)槭莻鲄?,所以createPerson和obj兩個(gè)作用域變量一樣

構(gòu)造函數(shù)模式
//「 構(gòu)造函數(shù)模式;「 構(gòu)造函數(shù)當(dāng)做構(gòu)造函數(shù)使用,用new
function Person(name,age){
    this.name=name;
    this.age=age;
    this.load=function(){
        console.log(this.name,this.age);
    }
}

var toti=new Person("toti",18);
toti.load();
console.log(typeof toti);
// 」構(gòu)造函數(shù)模式;」構(gòu)造函數(shù)當(dāng)做構(gòu)造函數(shù)使用,用new

發(fā)生了什么?

在解釋發(fā)生的事情前,我們要先詳細(xì)了解下new的作用。在紅皮書中,new的作用,解釋的的確很淺,簡(jiǎn)單幾行字,不細(xì)讀,很難理清其中的邏輯。

NEW的作用

紅皮書中是這樣解釋的:

創(chuàng)建一個(gè)新對(duì)象

將構(gòu)造函數(shù)的作用域賦值給新對(duì)象

執(zhí)行構(gòu)造函數(shù)中的代碼

返回新對(duì)象

這幾行文字,一開始我也以為我讀懂了,但是它實(shí)在沒(méi)有很好地給讀者說(shuō)明白new到底怎么用的。

在這里,我引用一個(gè)我提問(wèn)中的網(wǎng)友的回答,下面是來(lái)自wei0613的回答:

function CO(){
    this.p = “I’m in constructed object”;
    this.alertP = function(){
        alert(this.p);
    }
}
var o2 = new CO();
var obj  ={};
obj.__proto__ = CO.prototype;
CO.call(obj);
return obj;

他用代碼形式給我們講解了其中發(fā)生了什么事:

new先創(chuàng)建了一個(gè)對(duì)象obj

然后CO函數(shù)的原型賦值給對(duì)象obj的原型

CO函數(shù)再使用call/apply方法把作用域賦給obj

到這一步才執(zhí)行構(gòu)造函數(shù)Co里面的代碼?。?!

返回obj對(duì)象

大家可能第一眼,并不能發(fā)現(xiàn)我這里的邏輯和紅皮書的邏輯有什么區(qū)別。首先,紅皮書的邏輯中,很明顯少了原型創(chuàng)建發(fā)生在哪一步,如果這里不清楚,會(huì)影響大家理解接下來(lái)原型模式和動(dòng)態(tài)原型模式的理解;其次,第4步是最重要的,也就是構(gòu)造函數(shù)的代碼執(zhí)行,是發(fā)生在第4步,call的使用和原型鏈的形成都發(fā)生在之前。如果我們僅僅只有一個(gè)大概概念,當(dāng)我們遇到對(duì)象字面量重寫的時(shí)候,我們很可能發(fā)現(xiàn)我們代碼寫得都沒(méi)有問(wèn)題,但是就是出bug的情況。這個(gè)工作流邏輯大家一定要清楚。

構(gòu)造函數(shù)里this的作用

在new的時(shí)候,所謂的作用域賦給新對(duì)象,就是使用了call/apply方法。

Person.apply(obj,arguments);

this就指向了obj對(duì)象

把this的屬性方法一個(gè)個(gè)添加到obj對(duì)象里面

其他不是this的屬性和方法,都會(huì)被忽略,比如:

function Person(name, age,job){
    this.name=name;
    this.age=age;
    this.load=function(){
        console.log(this.name,this.age);
    }
    var job=job;
}

job就不會(huì)被寫入obj對(duì)象里面

注意,當(dāng)我們new Person()的時(shí)候,是把函數(shù)當(dāng)作構(gòu)造函數(shù)使用的,但是它也是函數(shù),可以像普通函數(shù)一樣使用

//「 構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,不用new
function Person(name,age){
    this.name=name;
    this.age=age;
    this.load=function(){
        console.log(this.name,this.age);
    }
}

var mike=Person("mike",18);
//mike.load();會(huì)報(bào)錯(cuò),Person沒(méi)有對(duì)象返回
window.load();
// 」構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,不用new

直接使用函數(shù),等于在當(dāng)前作用域下運(yùn)行。在這種情況下,我們則會(huì)把this指向這個(gè)環(huán)境的作用域,在這里是window。我們使用mike.load()會(huì)報(bào)錯(cuò),因?yàn)閷傩院头椒ú](méi)有添加到mike這個(gè)對(duì)象中,而是添加到了window這個(gè)對(duì)象。

如果我們不用new,也可以實(shí)現(xiàn)this指向我們想指向的對(duì)象

//「 構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,call,apply
function Person(name,age){
    this.name=name;
    this.age=age;
    this.load=function(){
        console.log(this.name,this.age);
    }
}

var obj={};
Person.call(obj,"mike",18);
obj.load();
// 」構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,call,apply

這些變式其實(shí)都是在充分了解new和this的用法后,自然寫出來(lái)的。通過(guò)些變式,大家可以更好理解它們的用法。

相比工廠模式,構(gòu)造函數(shù)模式的優(yōu)缺點(diǎn)及思考

當(dāng)我們console.log(toti):

我們回顧工廠模式下,是:

所以構(gòu)造函數(shù)模式在這里比工廠模式更好,看到這里大家應(yīng)該明白書中:「不能識(shí)別對(duì)象類型」的問(wèn)題了。

構(gòu)造函數(shù)模式要點(diǎn)

解決:可以識(shí)別為一種特定的類型

缺點(diǎn):構(gòu)造函數(shù)的每個(gè)方法都被實(shí)例了一遍

思考:

構(gòu)造函數(shù)開頭大寫,其他函數(shù)開頭小寫

不使用new,相當(dāng)于普通函數(shù)使用,this指向window,為window添加變量和方法

也可以使用call和apply來(lái)為第三方作用域添加

重點(diǎn):

new

this

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82317.html

相關(guān)文章

  • 等風(fēng)來(lái)!區(qū)塊鏈熊市,技術(shù)人就要做技術(shù)投資

    摘要:年的區(qū)塊鏈牛市已經(jīng)過(guò)去了,目前看來(lái),年會(huì)是一個(gè)大熊市,投資抄幣估計(jì)也撈不著什么。熊市囤技術(shù),其實(shí)是技術(shù)人員很好的選擇。三期同學(xué)討論積累資料的地址等風(fēng)來(lái)區(qū)塊鏈熊市,技術(shù)人就要做技術(shù)投資。 2017 年的區(qū)塊鏈牛市已經(jīng)過(guò)去了,目前看來(lái),2018 年會(huì)是一個(gè)大熊市,投資抄幣估計(jì)也撈不著什么。熊市只能囤囤幣,囤囤技術(shù),只能等下一輪風(fēng)起了。熊市囤技術(shù),其實(shí)是技術(shù)人員很好的選擇。等區(qū)塊鏈牛市來(lái)了,...

    番茄西紅柿 評(píng)論0 收藏0
  • 【翻譯】理解 IPFS 白皮書 1部分

    摘要:理解白皮書第部分原文鏈接哦不,白皮書加密貨幣區(qū)塊鏈?zhǔn)澜缦矏?ài)白皮書,也不例外。要理解的工作原理,最好一步一步地學(xué)習(xí)白皮書。從開始,白皮書中明確提到了三個(gè)實(shí)現(xiàn)。白皮書指出小值等于或小于直接存儲(chǔ)在上。 理解 IPFS 白皮書 第 1 部分 原文鏈接:https://decentralized.blog/un... 哦不,白皮書! 加密貨幣 / 區(qū)塊鏈?zhǔn)澜缦矏?ài)白皮書,IPFS 也不例外。 它起...

    Ilikewhite 評(píng)論0 收藏0
  • 每周前端開源推薦三期

    摘要:每周前端開源推薦第三期是一個(gè)用很炫的動(dòng)畫來(lái)展示數(shù)字的庫(kù),效果非常贊。把放在第一位是因?yàn)楝F(xiàn)在毫無(wú)疑問(wèn)是最流行的實(shí)時(shí)框架。如此巨額的投資保證了開源小組高質(zhì)的開發(fā),目前版本號(hào)是。目前貌似主要面向請(qǐng)應(yīng)用。 每周前端開源推薦第三期 HubSpot / odometer Beautiful CSS3 Number Transitions #hubspot-open-source h...

    senntyou 評(píng)論0 收藏0
  • 每周前端開源推薦三期

    摘要:每周前端開源推薦第三期是一個(gè)用很炫的動(dòng)畫來(lái)展示數(shù)字的庫(kù),效果非常贊。把放在第一位是因?yàn)楝F(xiàn)在毫無(wú)疑問(wèn)是最流行的實(shí)時(shí)框架。如此巨額的投資保證了開源小組高質(zhì)的開發(fā),目前版本號(hào)是。目前貌似主要面向請(qǐng)應(yīng)用。 每周前端開源推薦第三期 HubSpot / odometer Beautiful CSS3 Number Transitions #hubspot-open-source h...

    enrecul101 評(píng)論0 收藏0
  • 每周前端開源推薦三期

    摘要:每周前端開源推薦第三期是一個(gè)用很炫的動(dòng)畫來(lái)展示數(shù)字的庫(kù),效果非常贊。把放在第一位是因?yàn)楝F(xiàn)在毫無(wú)疑問(wèn)是最流行的實(shí)時(shí)框架。如此巨額的投資保證了開源小組高質(zhì)的開發(fā),目前版本號(hào)是。目前貌似主要面向請(qǐng)應(yīng)用。 每周前端開源推薦第三期 HubSpot / odometer Beautiful CSS3 Number Transitions #hubspot-open-source h...

    littleGrow 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<