ES6--對象擴(kuò)展

簡潔表示法

{
    //簡潔表示法
    let o=1;
    let k=2;
    let es5={
        o:o,
        k:k
    }
    let es6={
        o,k
    }
    console.log(es5,es6)
    //{o: 1, k: 2} {o: 1, k: 2}

    let es5_m={
        hello:function(){
            console.log("hello")
        }
    }
    let es6_m={
        hello(){
            console.log('world')
        }
    }
    console.log(es5_m.hello(),es6_m.hello())
    //hello world

}

在對象中如果有函數(shù),es6中采用簡潔表示,a(c){},如果在es6中定義一個(gè)函數(shù),那么采用箭頭函數(shù)let a=(c)=>{}。

屬性表達(dá)式

{
    //屬性表達(dá)式
    let a='b';
    let es5_o={
        a:'c'
    }
    let es6_o={
        [a]:'c'//[a]的值是b
    }
    console.log(es5_o,es6_o[a])
    //{a: "c"} {b: "c"}
}

在屬性表達(dá)式中,es6可以采用變量的方式去定義key值,es5中的key值只能是固定的,在對象調(diào)用key值的時(shí)候,es6如果想采用key值,那么采取中括號的方式[],.的方式不能得到變量。

方法的name屬性

函數(shù)的name屬性,返回函數(shù)名。對象方法也是函數(shù),因此也有name屬性。

const person = {
  sayName() {
    console.log('hello!');
  },
};

person.sayName.name   // "sayName"

新增api

Object.is()
用來判斷兩個(gè)對象是否相等,在es5中NaN和NaN不相等,用這個(gè)方法相等。

{
    //新增api
    console.log(Object.is('abc','abc'))
    //true
    console.log(Object.is([1],[1]))
    //false數(shù)組是引用類型,地址不一樣,is()的功能和三個(gè)等號功能差不多
}

Object.assign()
方法用于將所有可枚舉的屬性的值從一個(gè)或多個(gè)源對象復(fù)制到目標(biāo)對象。它將返回目標(biāo)對象。
簡單的來說就是,在有指針的情況下,淺拷貝只是增加了一個(gè)指針指向已經(jīng)存在的內(nèi)存,而深拷貝就是增加一個(gè)指針并且申請一個(gè)新的內(nèi)存,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存,采用深拷貝的情況下,釋放內(nèi)存的時(shí)候就不會出現(xiàn)在淺拷貝時(shí)重復(fù)釋放同一內(nèi)存的錯(cuò)誤!

Object.assign(target, ...sources)

{
    console.log(Object.assign({a:"a"},{b:"b"}))
    //{a: "a", b: "b"}只能是淺拷貝,即引用地址不會改變。
}
function test() {
  let a = { b: {c:4} , d: { e: {f:1}} }
  let g = Object.assign({},a)
  let h = JSON.parse(JSON.stringify(a));
  console.log(g.d) // { e: { f: 1 } }
  g.d.e = 32
  console.log('g.d.e set to 32.') // g.d.e set to 32.
  console.log(g) // { b: { c: 4 }, d: { e: 32 } }
  console.log(a) // { b: { c: 4 }, d: { e: 32 } }
  console.log(h) // { b: { c: 4 }, d: { e: { f: 1 } } }
  h.d.e = 54
  console.log('h.d.e set to 54.') // h.d.e set to 54.
  console.log(g) // { b: { c: 4 }, d: { e: 32 } }
  console.log(a) // { b: { c: 4 }, d: { e: 32 } }
  console.log(h) // { b: { c: 4 }, d: { e: 54 } }
}
test();

Object.entries()

{
    let test={k:123,o:456};
    for(let [key,value] of Object.entries(test)){
        console.log(key,value)
    }
}

proto屬性,Object.setPrototypeOf(),Object.getPrototypeOf()

Object.setPrototypeOf()相當(dāng)于proto,用來設(shè)置當(dāng)前對象的prototype對象,相當(dāng)于一個(gè)實(shí)例的proto等于構(gòu)造函數(shù)的prototype屬性。
proto屬性沒有寫入 ES6 的正文,而是寫入了附錄,原因是proto前后的雙下劃線,說明它本質(zhì)上是一個(gè)內(nèi)部屬性,而不是一個(gè)正式的對外的 API,只是由于瀏覽器廣泛支持,才被加入了 ES6。標(biāo)準(zhǔn)明確規(guī)定,只有瀏覽器必須部署這個(gè)屬性,其他運(yùn)行環(huán)境不一定需要部署,而且新的代碼最好認(rèn)為這個(gè)屬性是不存在的。因此,無論從語義的角度,還是從兼容性的角度,都不要使用這個(gè)屬性,而是使用下面的Object.setPrototypeOf()(寫操作)、Object.getPrototypeOf()(讀操作)、Object.create()(生成操作)代替。

// 格式
Object.setPrototypeOf(object, prototype)

// 用法
const o = Object.setPrototypeOf({}, null);

super關(guān)鍵字

this關(guān)鍵字總是指向函數(shù)所在的當(dāng)前對象,ES6 又新增了另一個(gè)類似的關(guān)鍵字super,指向當(dāng)前對象的原型對象

const proto = {
  foo: 'hello'
};

const obj = {
  find() {
    return super.foo;
  }
};

Object.setPrototypeOf(obj, proto);
obj.find() // "hello"

上面代碼中,對象obj的find方法之中,通過super.foo引用了原型對象proto的foo屬性。

注意,super關(guān)鍵字表示原型對象時(shí),只能用在對象的方法之中,用在其他地方都會報(bào)錯(cuò)。

擴(kuò)展運(yùn)算符,支持不好

{
    //擴(kuò)展運(yùn)算符
    let {a,b,...c}={a:'test',b:'kill',c:'ddd',d:"ccc"};
    c={
        c:"ddd",
        d:"ccc"
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容