第4章 對象的改動

對象的改變

ES6對象的變化不多,主要有以下幾點變化:

  1. 語法簡化和語法改變;
  2. 添加一些新的方法,Object.is(), Object.assign(), Object.setPrototypeOf();
  3. 引入super()

一.語法改變

1.語法簡化

ES6語法簡化主要是一下2個方面:

1.屬性初始化器 property initializer

// ES5-,返回的對象字面量對參數進行復制后賦值
function createPerson(name, age) {
    return {
        name: name,
        age: age
    };
}

ES6簡化這種寫法:當對象屬性名和局部變量名一樣時,可以省略冒號和值

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

2.簡寫方法 concise methods

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

ES6可以省略冒號和function關鍵詞,簡寫語法的另一個用處就是可以調用super()方法,非簡寫語法則不能(后面會介紹super方法)

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

2.計算屬性名

變量可以作為對象字面量屬性:

let lastName = "last name";
let person = {
    "first name": "Nicholas",
    [lastName]: "Zakas"       // 使用方括號將變量添加進去 
};
person["first name"]; // "Nicholas"
person[lastName]; // "Zakas" 變量計算為字符串"last name"

// 另一種用法
var suffix = "name";
var person = {
    ["first" + suffix]: "Nicholas",
    ["last" + suffix]: "Zakas"
};
person("first name"); // "Nicholas"
person("last name"); // "Zakas"

3.語法修改

ES5 嚴格模式下不允許有重復屬性, 而ES6嚴格和非嚴格模式都允許有重復屬性

// ES5嚴格模式下, 下面情況拋出錯誤; ES6 則允許這種情況 
"use strict;"
var obj = {
    name: "Nicholas",
    name: "James"
};  

二.新方法

1.Object.is()

這個方法用于判斷一些嚴格等于以前不能判斷的等式,比如isNaN()判斷NaN不夠準確,+0,-0之間的問題。

// 我們知道NaN自身都不相等
NaN === NaN; // false
// 判斷NaN用isNaN方法,但是這個方法并不準確,undefined也會返回true,如:
isNaN(NaN); // true
isNaN(undefined); // true

// 可以自定義一個函數來判斷NaN
function isReallyNaN(o) {
    if (typeof o === "number") {
        return o !== o;
    }
    return false;
}
isReallyNaN(NaN); // true
isReallyNaN(undefined); // false

ES6方法

Object.is(NaN, NaN); // true

// 對于+0,-0 js引擎中兩者是不相等的,但是一般比較
+0 === -0; // true
Object.is(+0, -0); // false

2.Object.assign()

對象組合模式在js中很流行,一般我們稱之為mixins, 指的是將一個對象的屬性和方法賦給另一個對象。

ES5:

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

ES6 Object.assign()和上面的方法差不多,不過可以接受任意supplier

Object(receiver, supplier[, supplier...]);
// **supplier中若有重復屬性, 后面的屬性將重寫前面的屬性**
var receiver = {};
Object.assign(reveiver, 
    {
        type: "js",
        name: "file.js"
    },
    {
        type: "css"
    }
);
receiver.name; // "file.js"
receiver.type; // "css"

3.Object.setPrototypeOf()

ES6之前一個對象的原型在創建之后是不能改變的, ES6通過新方法setPrototypeOf()來修改一個對象的原型。

Object.setPrototypeOf(obj, protoObj);
// 通過修改對象內部[[prototype]]屬性

eg

let person = {
    saySomething() {
        return "hello";
    }
};

let dog = {
    saySomething() {
        return "woof";
    }
};

let friend = Object.create(person);
friend.saySomething(); // "hello"
Object.getPrototypeOf(friend) === person; // true

// 將原型改為dog
Object.setPrototypeOf(friend, dog);
friend.saySomething(); // "woof"
Object.getPrototypeOf(friend) === dog; // true

三.super

為訪問對象原型提供了很大的便利,在多級原型(即多級繼承)中及其有用,在多級繼承中Object.getPrototypeOf()有些條件下是不能使用的。
只能用于簡寫方法中(concise method)

let person = {
    saySomething() {
        return "hello";
    }
};

let dog = {
    saySomething() {
        return "woof";
    }
};

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

Object.setPrototypeOf(friend, person);
friend.saySomething(); // "hello hi"
// 多級繼承
var rel = Object.create(friend); // rel 繼承 friend
**rel.saySomething(); // ERROR**

// 可以通過super簡寫上面friend對象
let friend = {
    saySomething() {
        return super.saySomething() + " hi";
    }
};

// 多級繼承中
var rel = Object.create(friend); // rel 繼承 friend
rel.saySomething(); // OK "hello hi"

總結

總的來講,ES6對象上的改動不是很大,主要是新添加了一些方法,和語法上的優化,最重要的是對原來一些比較模糊的概念進行了正是規范,還有super方法的引入,對繼承的便利提供了很大的幫助。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.屬性的簡潔表示法 允許直接寫入變量和函數 上面代碼表明,ES6 允許在對象之中,直接寫變量。這時,屬性名為變量...
    雨飛飛雨閱讀 1,158評論 0 3
  • 三,字符串擴展 3.1 Unicode表示法 ES6 做出了改進,只要將碼點放入大括號,就能正確解讀該字符。有了這...
    eastbaby閱讀 1,575評論 0 8
  • 第四章 擴展對象的功能性 1. 對象字面量語法擴展 直接看例子 ES6中通過屬性初始化的簡寫語法,可以消除這種屬性...
    NowhereToRun閱讀 749評論 0 2
  • 一、ES6簡介 ? 歷時將近6年的時間來制定的新 ECMAScript 標準 ECMAScript 6(亦稱 ...
    一歲一枯榮_閱讀 6,126評論 8 25
  • 他有個哥哥,是個傻子。 喜歡在水果皮上劃開一個小洞, 用一把長柄的小勺子挖去里面的肉。 然后,把挖空的果皮填進去另...
    找hui閱讀 260評論 0 0