模擬實(shí)現(xiàn)對(duì)象的新增方法 | 重學(xué)ES6

前言

ES6新增了很多屬性谴轮、方法以及某些特性噪窘,本系列主要通過(guò)模擬實(shí)現(xiàn)的方式來(lái)重學(xué)ES6,以便幫助自己更深入的的理解那些新增的東西。

本文目標(biāo):模擬實(shí)現(xiàn)對(duì)象的新增方法

image.png

模擬實(shí)現(xiàn)

說(shuō)明:

  1. 只簡(jiǎn)單說(shuō)明用法,然后模擬實(shí)現(xiàn)
  2. 真實(shí)實(shí)現(xiàn)未必是這樣實(shí)現(xiàn),僅實(shí)現(xiàn)功能卜朗,用于理解

Object.is()

用法

該方法用于優(yōu)化===的兩個(gè)問(wèn)題:NaN不等于NaN+0等于-o

模擬實(shí)現(xiàn):_is方法

Object._is = function (one, two) {
    if (Number.isNaN(one) && Number.isNaN(two)) {
        return true;
    }
    if (one === 0 && two === 0) {
        if (1 / one < 0 && 1/two >0){
            return false
        }
        if (1 / one > 0 && 1/two <0) {
            return false
        } 
    }
    return one === two;
}
console.log(Object._is(NaN,NaN));//true
console.log(Object._is(+0, -0));//false
console.log(Object._is(-0, +0));//false

這里有個(gè)小竅門(mén)咕村,就是判斷一個(gè)數(shù)是+0還是-0场钉,正常是比較難判斷的,因?yàn)樗麄兌既扔?code>0懈涛,但是我可以利用一個(gè)正數(shù)除以+0Infinity逛万,除以-0-Infinity的規(guī)律,在通過(guò)Infinity-Infinity分別跟0比較批钠,判斷出是-0還是+0

Object.assign()

用法

assign用于把多個(gè)對(duì)象合并到到一個(gè)對(duì)象上宇植,第一個(gè)參數(shù)是要把其他對(duì)象合并到的對(duì)象target,剩下其他參數(shù)是要被合并的對(duì)象埋心,返回target

模擬實(shí)現(xiàn):_assign方法

Object._assign = function () {
    if (arguments.length == 0) {
        throw new TypeError(`Cannot convert undefined or null to object`);
    }
    if (arguments.length == 1) {
        return arguments[0];
    }
    if (arguments.length >= 2) {
        let target = arguments[0];
        for (let i = 1; i < arguments.length; i++) {    
            // 拿出每一個(gè)要被合并的對(duì)象指郁,判斷對(duì)象里面屬性,在arguments[0]中是否已經(jīng)存在拷呆,沒(méi)有存在則加入闲坎,有存在就覆蓋疫粥。               
            for(let key in arguments[i]){
                    //key表示每個(gè)要合并的對(duì)象的屬性,直接添加到target中去就可以腰懂,有就覆蓋梗逮,沒(méi)有就添加
                    target[key] = arguments[i][key];
            }
        }
        return target
    }
}
let obj1 = { name: 'a' };
let obj2 = { name: 'b' }
console.log(Object._assign(obj1, obj2));

Object.getPrototypeOf()

用法

用于獲取對(duì)象的原型

模擬實(shí)現(xiàn):_getPrototypeOf方法

Object._getPrototypeOf = function (target) {
    return target.__proto__;
}

Object.setPrototypeOf()

用法

用于設(shè)置對(duì)象的原型

模擬實(shí)現(xiàn):_getPrototypeOf方法

Object._setPrototypeOf = function (target, proto) {
    target.__proto__ = proto;
}

Object.create()

使用

Object.create()用于產(chǎn)生指定原型的新對(duì)象,返回該對(duì)象悯恍。第一個(gè)參數(shù)可以是某個(gè)對(duì)象,也可以是null伙狐,如果是null表示該對(duì)象沒(méi)有原型涮毫。

模擬實(shí)現(xiàn):_create方法

Object._create = function(proto){
    let obj = {}
    Object.setPrototypeOf(obj,proto)
    return obj
}

Object.keys()、Object.values()贷屎、Object.entries()

用法

Object.keys()是ES5新增方法罢防,用于返回由對(duì)象的key組成的數(shù)組

Object.valuesObject.entries是ES2017引入的方法,分別用于返回由對(duì)象的value組成的數(shù)組唉侄、返回由多個(gè)keyvalue組成的鍵值對(duì)的數(shù)組

由于大家梳理ES6的時(shí)候都加上它咒吐,所以我們也一起來(lái)寫(xiě)一下

模擬實(shí)現(xiàn):_keys_values属划、_entries

  • _keys實(shí)現(xiàn)
Object._keys = function(o){
    let res = [];
    for(let key in o){
        res.push(key)
    }
    return res;
}
console.log(Object._keys(obj));//["a", "b", "c"]
  • _values實(shí)現(xiàn)
Object._values = function(o){
    let res = [];
    for(let key in o){
        res.push(o[key]);
    }
    return res;
}
let obj = {a:1,b:2,c:3};
console.log(Object._values(obj));//[1, 2, 3]
  • _entries實(shí)現(xiàn)
Object._entries = function(o){
    let res = [];
    for(let key in o){
        res.push([key,o[key]]);
    }
    return res;
}
let obj = {a:1,b:2,c:3};
console.log(Object._entries(obj));//[["a", 1], ["b", 2], ["c", 3]]

Object.fromEntries()

用法

相當(dāng)于創(chuàng)建對(duì)象恬叹,它是將鍵值對(duì)的數(shù)組轉(zhuǎn)成對(duì)象。

因此被傳入的數(shù)組格式必須像這樣子[['name','Alice'],['age',12],...]

模擬實(shí)現(xiàn)

Object._fromEntries = function(arr){
    // 要求接受的必須是數(shù)組
    if(Array.isArray(arr)){
        // 里面的每一項(xiàng)也必須是數(shù)組同眯,并且長(zhǎng)度要為2
        let isTwoLengthArray = arr.some(val =>{
            return Array.isArray(val) &&  val.length == 2 
        });
        if(isTwoLengthArray){
            let obj = {}
            arr.forEach(val => {
                obj[val[0]] = val[1]
            });
            return obj
        }
    }
    // 還有可能是map之類(lèi)的數(shù)據(jù)結(jié)構(gòu)绽昼,待實(shí)現(xiàn)
}
let person = [['name','Alice'],['age',12]]
console.log(Object._fromEntries(person))//{name: "Alice", age: 12}

Object.getOwnPropertyDescriptors()

用法

這個(gè)方法其實(shí)是ES2017引入的,用于返回傳入對(duì)象的所有自身屬性的描述

模擬實(shí)現(xiàn):_getOwnPropertyDescriptors方法

function _getOwnPropertyDescriptors(obj) {
  const res = {};
  for (let key of Reflect.ownKeys(obj)) {
    res[key] = Object.getOwnPropertyDescriptor(obj, key);
  }
  return res;
}

proto屬性

用法

用于返回傳入對(duì)象的原型對(duì)象

模擬實(shí)現(xiàn):_proto_

Object.prototype._proto_ = Object.getPrototypeOf(obj);

END

以上就是ES6對(duì)象身上新增的屬性和方法的模擬實(shí)現(xiàn)!

我知道還有很多問(wèn)題待完善须蜗,但我只要熟悉這些方法具體干了什么硅确,也就達(dá)到了我這次學(xué)習(xí)的目的!

如有疑問(wèn)或建議明肮,希望可以留言告知菱农,感謝你!柿估!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末循未,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秫舌,更是在濱河造成了極大的恐慌只厘,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舅巷,死亡現(xiàn)場(chǎng)離奇詭異羔味,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钠右,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)赋元,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事搁凸∶闹担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵护糖,是天一觀的道長(zhǎng)褥芒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嫡良,這世上最難降的妖魔是什么锰扶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮寝受,結(jié)果婚禮上坷牛,老公的妹妹穿的比我還像新娘。我一直安慰自己很澄,他們只是感情好京闰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著甩苛,像睡著了一般蹂楣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讯蒲,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天捐迫,我揣著相機(jī)與錄音,去河邊找鬼爱葵。 笑死施戴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萌丈。 我是一名探鬼主播赞哗,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辆雾!你這毒婦竟也來(lái)了肪笋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤度迂,失蹤者是張志新(化名)和其女友劉穎藤乙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體惭墓,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坛梁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腊凶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片划咐。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拴念,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褐缠,到底是詐尸還是另有隱情政鼠,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布队魏,位于F島的核電站公般,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胡桨。R本人自食惡果不足惜官帘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望登失。 院中可真熱鬧遏佣,春花似錦挖炬、人聲如沸揽浙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馅巷。三九已至,卻和暖如春草姻,著一層夾襖步出監(jiān)牢的瞬間钓猬,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工撩独, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敞曹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓综膀,卻偏偏與公主長(zhǎng)得像澳迫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剧劝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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