Array.prototype.concat() 和 Object.assign()

ES6 中提供了一些對(duì)象的方法擴(kuò)展,其中的 Object.assgin() 讓我印象深刻,因?yàn)樗氖褂梅绞胶托Ч沉悖屛蚁肫鹆藬?shù)組的拼接方法:Array.prototype.concant()喷楣。他們有著一些相似的寫法和功能,當(dāng)然也有著一些區(qū)別恩伺,讓我們來(lái)一起探討吧赴背!
先來(lái)看看下面兩段代碼

let arr1 = ['a', 'b'];
let arr2 = ['a', 'c'];
let arr3 = arr1.concat(arr2);
// arr3: ['a', 'b', 'a', 'c']

let obj1 = {name: '張三', age: 22};
let obj2 = {name: '李四', sex: 'boy'};
let obj3 = Object.assgin(obj1, obj2);
// obj3: {name: '李四', age: 22, sex: 'boy'}

很顯然,他們都出色地完成了多個(gè)目標(biāo)的合并,但是仔細(xì)一看凰荚,還是有著一些不同之處:

concat() 方法與其說(shuō)是合并燃观,更像是拼接,把多個(gè)目標(biāo)按順序拼接到一起

Object.assgin() 方法則更傾向于合并便瑟,它同樣按照順序進(jìn)行合并缆毁,不同之處是重名的屬性,會(huì)保留最新的

這是他們最為初步的不同到涂,再把這幾個(gè)數(shù)組和對(duì)象進(jìn)行逐個(gè)打印觀察:

// 在 concat 合并之前脊框,我們給 arr2 本身,和它的原型對(duì)象践啄,分別加上不同的屬性
arr2.myLeng = function () {
    console.log(this.length);
};
arr2.__proto__.proLeng = function () {
    console.log(this.length);
};
// 使用 concat 進(jìn)行合并后浇雹,調(diào)用這兩個(gè)方法
arr3.myLeng();  // 報(bào)錯(cuò)
arr3.proLeng();  // 4

我們驚訝地發(fā)現(xiàn),原型對(duì)象上的方法 proLeng 也被復(fù)制過(guò)來(lái)了屿讽,但是數(shù)組本身上的方法 myLeng 并沒有成功被復(fù)制過(guò)來(lái)昭灵。

再看看 Object.assgin() 的表現(xiàn):

// 和上段代碼相似的插入位置
obj2.from = 'China';
obj2.__proto__.myAge = function () {
    console.log(this.age);
};

console.log(obj3.from); // China
obj3.myAge(); // 22

顯然,復(fù)制過(guò)來(lái)的就是它本身的屬性伐谈,所以 from 存在沒有什么爭(zhēng)議虎锚,關(guān)鍵是 obj2 原型對(duì)象上的 myAge 方法同樣被繼承了

又可以總結(jié)一條:

concat() 方法創(chuàng)建出來(lái)的新數(shù)組,會(huì)繼承參與拼接數(shù)組原型對(duì)象上的屬性和方法衩婚,但是原數(shù)組本身的屬性和方法并不會(huì)被繼承窜护。

而 Object.assgin() 方法操作的源對(duì)象,會(huì)繼承參與合并對(duì)象“本身”和其“原型對(duì)象”上的屬性和方法

但是非春!熟悉原型鏈和原型對(duì)象的同學(xué)發(fā)現(xiàn)有點(diǎn)問題了柱徙!

注意:因?yàn)槭褂?proto 直接操作的是對(duì)應(yīng)構(gòu)造函數(shù)的原型對(duì)象,如數(shù)組的是 Array.prototype奇昙,對(duì)象的是 Object.prototype护侮,所以 concat 和 Object.assgin() 嚴(yán)格上來(lái)講并不是把這些原型對(duì)象上的方法給賦值繼承了過(guò)來(lái),而是操作 proto 的時(shí)候储耐,會(huì)影響全部由對(duì)應(yīng)構(gòu)造函數(shù)生成出來(lái)的對(duì)象或數(shù)組羊初。

那要怎么辦呢,很簡(jiǎn)單什湘,咱們自己自定義一個(gè)構(gòu)造函數(shù)长赞,給這個(gè)構(gòu)造函數(shù)的原型對(duì)象添加方法。然后用這個(gè)構(gòu)造函數(shù)進(jìn)行實(shí)例化闽撤,讓他參與 Object.assgin()得哆,看源對(duì)象是否會(huì)繼承:

let obj = {name: 'obj', type: 'a'};

// 自定義構(gòu)造函數(shù)
let Cobj = function (name) {
    this.name = name;
};

// 給原型對(duì)象上添加方法
Cobj.prototype.getName = function () {
    console.log(this.name);
};

let obj2 = new Cobj('obj2');  // 實(shí)例化
Object.assgin(obj, obj2);
console.log(obj);  // {name: 'obj2', type: 'a'}
obj.getName();  // 報(bào)錯(cuò)

很遺憾,如果是自定義構(gòu)造函數(shù)實(shí)例出來(lái)的對(duì)象哟旗,則不會(huì)繼承他原型對(duì)象上的方法贩据。

結(jié)合上面的注意點(diǎn)栋操,我們可以很容易看出來(lái),其實(shí) Object.assgin() 并不會(huì)繼承參與合并對(duì)象的原型對(duì)象 prototype

最后把前面列舉的不同進(jìn)行一些匯總:

  1. 兩個(gè)方法都是按順序進(jìn)行和并饱亮,但是 Object.assgin 會(huì)把重復(fù)的屬性進(jìn)行保留最新值的操作矾芙,concat 不會(huì)
  2. concat 會(huì)創(chuàng)建一個(gè)新的數(shù)組,不會(huì)影響參與合并的原數(shù)組近上。而 Object.assgin 則是把第一個(gè)參數(shù)對(duì)象當(dāng)成操作對(duì)象蠕啄,把其他參數(shù)對(duì)象的屬性往它身上進(jìn)行合并,不會(huì)創(chuàng)建新對(duì)象戈锻,是對(duì)第一個(gè)參數(shù)對(duì)象的直接操作
  3. concat 創(chuàng)建出來(lái)的新數(shù)組歼跟,和Object.assgin 操作的對(duì)象,并不會(huì)繼承有參與合并對(duì)象“本身”及“原型對(duì)象”上的方法和屬性

以上就是一些小小的實(shí)驗(yàn)總結(jié)了格遭,為了詳細(xì)之余難免有些亢長(zhǎng)了哈街,可能有些觀點(diǎn)并不完全準(zhǔn)確,歡迎大家一起留言探討拒迅!

原文鏈接:https://blog.csdn.net/weixin_41399785/article/details/78926042

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骚秦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子璧微,更是在濱河造成了極大的恐慌作箍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件前硫,死亡現(xiàn)場(chǎng)離奇詭異胞得,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)屹电,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門阶剑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人危号,你說(shuō)我怎么就攤上這事牧愁。” “怎么了外莲?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵猪半,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我偷线,道長(zhǎng)磨确,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任淋昭,我火速辦了婚禮俐填,結(jié)果婚禮上安接,老公的妹妹穿的比我還像新娘翔忽。我一直安慰自己英融,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布歇式。 她就那樣靜靜地躺著驶悟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪材失。 梳的紋絲不亂的頭發(fā)上痕鳍,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音龙巨,去河邊找鬼笼呆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛旨别,可吹牛的內(nèi)容都是我干的诗赌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼秸弛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铭若!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起递览,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叼屠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后绞铃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镜雨,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年儿捧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冷离。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纯命,死狀恐怖西剥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亿汞,我是刑警寧澤瞭空,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站疗我,受9級(jí)特大地震影響咆畏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吴裤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一旧找、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麦牺,春花似錦钮蛛、人聲如沸鞭缭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岭辣。三九已至,卻和暖如春甸饱,著一層夾襖步出監(jiān)牢的瞬間沦童,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工叹话, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偷遗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓驼壶,卻偏偏與公主長(zhǎng)得像鹦肿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辅柴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容