ES6(四)扩展的对象功能2

2020-05-16  本文已影响0人  蒋小花_4b6c

1.重复的对象字面量属性

2.自有属性的枚举顺序

3.修改对象的原型

4.正式的方法定义

5.总结

重复的对象字面量属性

ES5 严格模式为重复的对象字面量属性引入了一个检查,若找到重复的属性名,就会抛出错

误。

ES5:

"use strict"; 

ES5:

var person = {

    name: "Nicholas",

    name: "Greg"    // 在 ES5 严格模式中是语法错误

};

ES6 移除了重复属性的 检查,严格模式与非严格模式都不再检查重复的属性。当存在重复属性时,排在后面的属性 的值会成为该属性的实际值.

"use strict";

var person = {

    name: "Nicholas",

    name: "Greg"    // 在 ES6 严格模式中不会出错

};

console.log(person.name); // "Greg"

自有属性的枚举顺序

ES5 并没有定义对象属性的枚举顺序,而是把该问题留给了 JS 引擎厂商。

而 ES6 则严格定义了对象自有属性在被枚举时返回的顺序

有属性枚举时基本顺序如下:

1.  所有的数字类型键,按升序排列。

2.  所有的字符串类型键,按被添加到对象的顺序排列。

3.  所有的符号类型键,也按添加顺序排列。

for-in 循环的枚举顺序仍未被明确规定,

因为并非所有的 JS 引擎都采用相同的方式。

而 Object.keys()  和 JSON.stringify() 

也使用了与 for-in  一样的枚举顺序

var obj = {

    a: 1,

    0: 1,

    c: 1,

    2: 1,

    b: 1,

    1: 1

};

obj.d = 1;

console.log(Object.getOwnPropertyNames(obj).join("")); // 012acbd

修改对象的原型

let person = {

    getGreeting() {

        return "Hello";

    }

};

let dog = {

    getGreeting() {

        return "Woof";

    }

};

// 原型为 person

let friend = Object.create(person); // 创建一个对象

console.log(friend.getGreeting()); // "Hello"

console.log(Object.getPrototypeOf(friend) === person);  // true 任意指定对象中获取其原型

// 将原型设置为 dog

Object.setPrototypeOf(friend, dog);

// 此方法允许你修改任意指 定对象的原型。

// 它接受两个参数:需要被修改原型的对象,以及将会成为前者原型的对象。

console.log(friend.getGreeting());  // Woof

console.log(Object.getPrototypeOf(friend) === dog); // true

正式的方法定义

ES6 之前,“方法”的概念从未被正式定义,它此前仅指对象的函数属性(而非数据属 性)。

 ES6 则正式做出了定义:方法是一个拥有[[HomeObject]] 内部属性的函数,

let person = {

    // 方法

    getGreeting() {

    return "Hello";

    }

};

// 并非方法

function shareGreeting() {

    return "Hi!";

}

总结

对象是 JS 编程的中心。

上一篇下一篇

猜你喜欢

热点阅读