成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

ES6系列---對(duì)象功能擴(kuò)展

sarva / 1844人閱讀

摘要:通過(guò)多種方式來(lái)加強(qiáng)對(duì)象的使用,通過(guò)簡(jiǎn)單的語(yǔ)法擴(kuò)展,提供更多操作對(duì)象及與對(duì)象交互的方法。增強(qiáng)對(duì)象原型改變對(duì)象的原型正常情況下,無(wú)論是通過(guò)構(gòu)造函數(shù)還是方法創(chuàng)建對(duì)象,其原型是在被創(chuàng)建時(shí)指定的。引用相當(dāng)于指向?qū)ο笤偷闹羔?/p>

ES6通過(guò)多種方式來(lái)加強(qiáng)對(duì)象的使用,通過(guò)簡(jiǎn)單的語(yǔ)法擴(kuò)展,提供更多操作對(duì)象及與對(duì)象交互的方法。

對(duì)象字面量語(yǔ)法擴(kuò)展 對(duì)象屬性初始值的簡(jiǎn)寫(xiě)

ES5中初始化屬性值的方式:

function createPerson(name, age) {
    return {
        name: name,
        age: age
    };
}

這段代碼中的createPerson()函數(shù)創(chuàng)建的對(duì)象,其屬性名與函數(shù)的參數(shù)相同,在返回的結(jié)果中,nameage分別重復(fù)了兩遍,只是其中一個(gè)是對(duì)象屬性名,另一個(gè)是為屬性賦值的變量。

ES6中可以簡(jiǎn)單地只寫(xiě)屬性名即可:

function createPerson(name, age) {
    return {
        name,
        age
    };
}

當(dāng)對(duì)象字面量里只有一個(gè)屬性的名稱時(shí),JavaScript引擎會(huì)在可訪問(wèn)作用域中查找同名變量;如果找到,則該變量的值被賦給對(duì)象字面量的同名屬性。

對(duì)象方法的簡(jiǎn)寫(xiě)

ES5中定義對(duì)象方法:

var person = {
    name: "Nicholas",
    sayName: function() {
        console.log(this.name);
    }
};

ES6中簡(jiǎn)寫(xiě)后的對(duì)象方法:

var person = {
    name: "Nicholas",
    sayName() {
        console.log(this.name);
    }
};

二者唯一的區(qū)別是,簡(jiǎn)寫(xiě)方法可以使用super關(guān)鍵字(稍后會(huì)討論)。

可計(jì)算屬性名

ES5中,如果想要通過(guò)計(jì)算得到屬性名,就需要使用方括號(hào)代替點(diǎn)記法,請(qǐng)看:

var person = {};
    lastName = "last name";
    
person["first name"] = "Nicholas";
person[lastName] = "Zakas";

console.log(person["first name"]);   // "Nicholas"
console.log(person[lastName]);   // "Zakas"

ES5在對(duì)象字面量中,也可以直接使用字符串字面量作為屬性名:

var person = {
    "first name": "Nicholas"
};

console.log(person["first name"]);  // "Nicholas"

這種模式適用于屬性名提前已知或可被字符串字面量表示的情況。然而,如果屬性名"first name"被包含在一個(gè)變量中(就像之前的示例中的那樣),或者需要通過(guò)計(jì)算才能得到該變量的值,那么ES5中是無(wú)法為一個(gè)對(duì)象字面量定義該屬性的。

而在ES6中,可在對(duì)象字面量中使用可計(jì)算屬性名,請(qǐng)看:

let lastName = "last name";

let person = {
    "first name": "Nicholas",
    [lastName]: "Zakas"
};

console.log(person["first name"]);  // "Nicholas"
console.log(person[lastName]);   // "Zakas"

在對(duì)象字面量中使用方括號(hào)表示該屬性名是可計(jì)算的,它的內(nèi)容將被求值并最終轉(zhuǎn)化為一個(gè)字符串,因而同樣可以使用表達(dá)式作為屬性的可計(jì)算名稱,例如:

var suffix = " name";

var person = {
    ["first" + suffix]: "Nicholas",
    ["last" + suffix]: "Zakas"
};

console.log(person["first name"]);  // "Nicholas"
console.log(person["last name"]);   // "Zakas"
新增方法 Object.is()方法

當(dāng)你想在JavaScript中比較兩個(gè)值時(shí),可能習(xí)慣于使用相等運(yùn)算符(==)或全等運(yùn)算符(===),許多開(kāi)發(fā)者更喜歡后者,從而避免在比較時(shí)觸發(fā)強(qiáng)制類(lèi)型轉(zhuǎn)換的行為。但即使全等運(yùn)算符也不完全準(zhǔn)確,比如+0和-0在JavaScript引擎中被表示為兩個(gè)完全不同的實(shí)體,而如果使用全等運(yùn)算符===對(duì)兩者進(jìn)行比較,得到的結(jié)果是兩者相等;同樣,NaN===NaN的返回值為false,需要使用isNaN()方法才可以正確檢測(cè)NaN。

ES6引入了Object.is()方法來(lái)彌補(bǔ)全等運(yùn)算符的不準(zhǔn)確運(yùn)算。請(qǐng)看示例:

console.log(+0 == -0);   // true
console.log(+0 === -0);  // true
console.log(Object.is(+0, -0));  // false

console.log(NaN == NaN);  // false
console.log(NaN === NaN);  // false
console.log(Object.is(NaN, NaN));  // true

consolog.log(5 == 5);   // true
consolog.log(5 == "5");   // true
consolog.log(5 === 5);   // true
consolog.log(5 === "5");   // false
console.log(Object.is(5, 5));   // true
console.log(Object.is(5, "5"));   // false

對(duì)于Object.is()方法來(lái)說(shuō),其運(yùn)行結(jié)果在大部分情況下與===運(yùn)算符相同,唯一的區(qū)別在于+0和-0被識(shí)別為不相等并且NaN與NaN等價(jià)。但是你大可不必拋棄等號(hào)運(yùn)算符,是否選擇使用Object.is()方法而不是===取決于那些特殊情況如何影響代碼。

Object.assign()方法

混合(Mixin)是JavaScript種實(shí)現(xiàn)對(duì)象組合最流行的一種模式。在一個(gè)mixin方法中,一個(gè)對(duì)象接收來(lái)自另一個(gè)對(duì)象的屬性和方法,許多JavaScript庫(kù)中都有類(lèi)似minxin方法:

function mixin(receiver, supplier) {
    Object.keys(supplier).forEach(function(key) {
        receiver[key] = supplier[key];
    });
    return receiver;
}

mixin()函數(shù)遍歷supplier的自有屬性并復(fù)制到receiver中(復(fù)制行為是淺復(fù)制,當(dāng)屬性值為對(duì)象時(shí)只復(fù)制對(duì)象的引用)。這樣一來(lái),receiver不通過(guò)繼承就可以獲得新屬性,請(qǐng)參考這段代碼:

function EventTarget() { ... }
EventTarget.prototype = {
    constructor: EventTarget,
    emit: function() { ... },
    on: function() { ... }
};

var myObject = {};
mixin(myObject, EventTarget.prototype);

myObject.emit("somethingChanged");

這種混合模式非常流行,因而ES6添加了Object.assign()方法來(lái)實(shí)現(xiàn)相同的功能:

Object.assign(myObject, EventTarget.prototype);

Object.assign()方法接受一個(gè)接收對(duì)象和任意數(shù)量的源對(duì)象,最終返回接收對(duì)象。如果多個(gè)源對(duì)象具有相同屬性,則排位靠后的會(huì)覆蓋排位靠前的。

需要注意的是,Object.assign()方法不能將提供者的訪問(wèn)器屬性復(fù)制到接收對(duì)象中。由于Object.assign()方法執(zhí)行了賦值操作,因此提供者的訪問(wèn)器屬性最終會(huì)轉(zhuǎn)變?yōu)榻邮諏?duì)象中的一個(gè)數(shù)據(jù)屬性,請(qǐng)看示例:

var receiver = {},
    supplier = {
        get name() {
            return "file.js";
        }
    };
    
Object.assign(receiver, supplier);

var descriptor = Object.getOwnPropertyDescriptor(receiver, "name");

console.log(descriptor.value);   // "file.js"
console.log(descriptor.get);     // undefined

在這段代碼中,supplier有一個(gè)名為name的訪問(wèn)器屬性。當(dāng)調(diào)用Object.assign()方法時(shí)返回字符串"file.js",因此receiver接收這個(gè)字符串后將其存為數(shù)據(jù)屬性receiver.name。

增強(qiáng)對(duì)象原型 改變對(duì)象的原型

正常情況下,無(wú)論是通過(guò)構(gòu)造函數(shù)還是Object.create()方法創(chuàng)建對(duì)象,其原型是在被創(chuàng)建時(shí)指定的。對(duì)象原型在實(shí)例化之后保持不變,直到ES5都是JavaScript編程最重要的設(shè)定之一,雖然在ES5中添加了Object.getPrototypeOf()方法來(lái)返回任意指定對(duì)象的原型,但仍缺少對(duì)象在實(shí)例化后改變?cè)偷臉?biāo)準(zhǔn)方法。

所以,在ES6中添加了Object.setPrototypeOf()方法來(lái)改變這一現(xiàn)狀:

let person = {
    getGreeting() {
        return "Hello";
    }
};

let dog = {
    getGreeting() {
        return "Woof";
    }
};

// 以person對(duì)象為原型
let friend = Object.create(person);
console.log(friend.getGreeting());     // "Hello"
console.log(Object.getPrototypeOf(friend) === person);   // true

// 將原型設(shè)置為dog
console.log(friend.getGreeting());   // "Woof"
console.log(Object.getPrototypeOf(friend) === dog);   // true

這段代碼定義了兩個(gè)基對(duì)象:persondog。二者多有getGreeting()方法。friend對(duì)象先繼承person對(duì)象,調(diào)用getGreeting()方法輸出"Hello";當(dāng)原型被變更為dog對(duì)象時(shí),原先與person對(duì)象的關(guān)聯(lián)被解除,調(diào)用person.getGreeting()方法時(shí)輸出的內(nèi)容就變?yōu)榱?Woof"。

對(duì)象原型的真實(shí)值被存儲(chǔ)在內(nèi)部專用屬性[[Prototype]]中,調(diào)用Object.getPrototypeOf()方法返回存儲(chǔ)在其中的值,調(diào)用Object.setPrototypeOf()方法改變其中的值。然而,這不是操作[[Prototype]]值的唯一方法。

用super簡(jiǎn)化原型訪問(wèn)

ES6引入了super引用的特性,使用它可以更便捷地訪問(wèn)對(duì)象原型。舉個(gè)例子,如果你想重寫(xiě)對(duì)象實(shí)例方法,又需要調(diào)用與它同名的原型方法,先看看ES5中的實(shí)現(xiàn):

let person = {
    getGreeting() {
        return "Hello";
    }
};

let dog = {
    getGreeting() {
        return "Woof";
    }
};

let friend = {
    getGreeting() {
        return Object.getPrototypeOf(this).getGreeting.call(this) + ", hi!";
    }
};

// 將原型設(shè)置為`person`
Object.setPrototypeOf(friend, person);
console.log(friend.getGreeting());   // "Hello, hi!"
console.log(Object.getPrototypeOf(friend) === person);   // true

// 將原型設(shè)置為`dog`
Object.setPrototypeOf(friend, dog);
console.log(friend.getGreeting());   // "Woof, hi!"
console.log(Object.getPrototypeOf(friend) === dog);   // true

在這個(gè)示例中,friend對(duì)象的getGreeting()方法調(diào)用了同名的原型方法。Object.getPrototypeOf()方法可以確保調(diào)用正確的原型,并向輸出字符串疊加另一個(gè)字符串;后面的.call(this)可以確保正確設(shè)置原型方法中的this值。

要準(zhǔn)確記得如何使用Object.getPrototypeOf()方法和.call(this)方法來(lái)調(diào)用原型上的方法實(shí)在有些復(fù)雜,所以ES6引入了super關(guān)鍵字。super引用相當(dāng)于指向?qū)ο笤偷闹羔槪?/p>

let friend = {
    getGreeting() {
        // return Object.getPrototypeOf(this).getGreeting.call(this) + ", hi!";
        return sper.getGreeting() + ", hi!";
    }
};

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/85178.html

相關(guān)文章

  • ES6系列文章 對(duì)象字面量

    摘要:使得聲明對(duì)象字面量更加簡(jiǎn)單,提供了屬性簡(jiǎn)寫(xiě)和方法簡(jiǎn)寫(xiě)功能,屬性名計(jì)算的新特性。屬性簡(jiǎn)寫(xiě)在及以前的版本中,對(duì)象字面量只支持鍵值對(duì)集合。實(shí)際業(yè)務(wù)中,對(duì)象字面量的初始化會(huì)有一定的代碼重復(fù)。 showImg(https://segmentfault.com/img/bVWd8N?w=320&h=235); ECMAScript6使得聲明對(duì)象字面量更加簡(jiǎn)單,提供了屬性簡(jiǎn)寫(xiě)和方法簡(jiǎn)寫(xiě)功能,屬性名計(jì)...

    snifes 評(píng)論0 收藏0
  • 做一名精致的JavaScripter 01:JavaScript簡(jiǎn)介

    摘要:精致從細(xì)節(jié)做起。標(biāo)準(zhǔn)會(huì)在每年的月發(fā)布一次,作為當(dāng)年的正式版本,便是年發(fā)布的正式版本。支持情況各大瀏覽器對(duì)的支持情況瀏覽器支持情況對(duì)的支持情況支持情況。在瀏覽器中基于實(shí)現(xiàn)的已經(jīng)成為的重要組成部分。 精致從細(xì)節(jié)做起。前端的工作也有一段時(shí)間了,大大小小的前端框架都有接觸過(guò),越是深入學(xué)習(xí)越是感覺(jué)之前的學(xué)習(xí)過(guò)于粗糙,基礎(chǔ)不夠扎實(shí),于是準(zhǔn)備近期把JavaScript的基礎(chǔ)知識(shí)點(diǎn)梳理一下,查缺補(bǔ)漏,...

    張巨偉 評(píng)論0 收藏0
  • JavaScript從初級(jí)往高級(jí)走系列————ES6

    摘要:采用二八定律,主要涉及常用且重要的部分。對(duì)象是當(dāng)前模塊的導(dǎo)出對(duì)象,用于導(dǎo)出模塊公有方法和屬性。箭頭函數(shù)函數(shù)箭頭函數(shù)把去掉,在與之間加上當(dāng)我們使用箭頭函數(shù)時(shí),函數(shù)體內(nèi)的對(duì)象,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象。 ES6 原文博客地址:https://finget.github.io/2018/05/10/javascript-es6/ 現(xiàn)在基本上開(kāi)發(fā)中都在使用ES6,瀏覽器環(huán)境...

    孫淑建 評(píng)論0 收藏0
  • 【全棧React】第2天: 什么是 JSX?

    摘要:代表基本上是常規(guī)。第次更新,在年完成。幾乎完全支持所有主要的瀏覽器。但這將是一段時(shí)間,直到較舊版本的瀏覽器逐步停止使用。這意味著將轉(zhuǎn)換為。在組件的情況下,寫(xiě)入的將如下所示在我們?cè)诘谝粋€(gè)作出反應(yīng)組件使用的語(yǔ)法是語(yǔ)法。 本文轉(zhuǎn)載自:眾成翻譯譯者:iOSDevLog鏈接:http://www.zcfy.cc/article/3797原文:https://www.fullstackreact....

    Eirunye 評(píng)論0 收藏0
  • ES6系列---類(lèi)

    摘要:原型會(huì)自動(dòng)調(diào)整,通過(guò)調(diào)用方法即可訪問(wèn)基類(lèi)的構(gòu)造函數(shù)。在簡(jiǎn)單情況下,等于類(lèi)的構(gòu)造函數(shù)的值是輸出這段代碼展示了當(dāng)調(diào)用時(shí)等于。 大多數(shù)面向?qū)ο缶幊陶Z(yǔ)言都支持類(lèi)和類(lèi)繼承的特性,而JavaScript只能通過(guò)各種特定方式模仿并關(guān)聯(lián)多個(gè)相似的對(duì)象。這個(gè)情況一直持續(xù)到ES5。由于類(lèi)似的庫(kù)層出不窮,最終ES6引入了類(lèi)特性,統(tǒng)一了類(lèi)和類(lèi)繼承的標(biāo)準(zhǔn)。 ES5模仿類(lèi) 先看一段ES5中模仿類(lèi)的代碼: func...

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

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

0條評(píng)論

sarva

|高級(jí)講師

TA的文章

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