微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ES6 --8对象的扩展、对象的新增方法

2019-11-6:

学习内容:对象的扩展

补充:

(1)对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。Object.getownPropertyDescriptor方法可以获取属性的描述对象。

let obj = { foo: 123 };
Object.getownPropertyDescriptor(obj, 'foo')
//  {
//    value: 123,
//    writable: true,
//    enumerable: true,
//    configurable: true
//  }

 


 

 对象的扩展:

一、对象的属性方法简介写法:

  ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性方法。这样的书写更加简洁。

  属性名和属性值一样时,可以只写一个(语法自动补足)

function getPoint() {
  const x = 1;
  const y = 10;
  return {x, y};
}

getPoint()
// {x:1, y:10}

 

// 方法:
const o = {
  method() {
    return "Hello!";
  }
};

// 等同于

const o = {
  method: function() {
    return "Hello!";
  }
};

 

打印对象用简洁表示法需要加大括号:

let user = {
  name: 'test'
};

let foo = {
  bar: 'baz'
};

console.log(user, foo)
// {name: "test"} {bar: "baz"}
console.log({user, foo})
// {user: {name: "test"}, foo: {bar: "baz"}}

  上面代码中,console.log直接输出userfoo两个对象时,就是两组键值对,可能会混淆。把它们放在大括号里面输出,就变成了对象的简洁表示法,每组键值对前面会打印对象名,这样就比较清晰了。

 

二、属性名表达式:

  注意:不能跟简洁表达法同用,会报错。

 

(1)定义对象的属性有两种方法

  方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内。

// 方法一
obj.foo = true;

// 方法二
obj['a' + 'bc'] = 123;

(2)ES6 允许字面量定义对象时,用方法二(表达式)作为对象的属性名,即把表达式放在方括号内。

// 例子一:
let lastWord = 'last word';

const a = {
  'first word': 'hello',
  [lastWord]: 'world'
};

a['first word'] // "hello"
a[lastWord] // "world"
a['last word'] // "world"


// 例子二:
let obj = {
  ['h' + 'ello']() {
    return 'hi';
  }
};

obj.hello() // hi

(3)注意,属性名表达式如果是一个对象,认情况下会自动将对象转为字符串[object Object](被掩盖),这一点要特别小心。

const keyA = {a: 1};
const keyB = {b: 2};

const myObject = {
  [keyA]: 'valueA',
  [keyB]: 'valueB'
};

myObject // Object {[object Object]: "valueB"}

 

三、name不仅函数有,对象的方法也有,返回该对象方法名称

  特别的,如果对象的方法一个 Symbol 值,那么name属性返回的是这个 Symbol 值的描述。

const key1 = Symbol('description');
const key2 = Symbol();
let obj = {
  [key1]() {},
  [key2]() {},
};
obj[key1].name // "[description]"
obj[key2].name // ""

 

四、属性的可枚举性与遍历:

  对象的enumerable属性,称为“可枚举性”,如果该属性false,就表示某些操作会忽略当前属性

  目前,有四个操作会忽略enumerablefalse属性

  • for...in循环:只遍历对象自身的和继承的可枚举的属性
  • Object.keys():返回对象自身的所有可枚举的属性的键名。
  • JSON.stringify():只串行化对象自身的可枚举的属性
  • object.assign(): 忽略enumerablefalse属性,只拷贝对象自身的可枚举的属性

  这四个操作之中,object.assign()是 ES6 新增的。其中,只有for...in会返回继承的属性,其他三个方法都会忽略继承的属性,只处理对象自身的属性。实际上,引入“可枚举”(enumerable)这个概念的最初目的,就是让某些属性可以规避掉for...in操作,不然所有内部属性方法都会被遍历到。比如,对象原型的toString方法,以及数组的length属性,就通过“可枚举性”,从而避免被for...in遍历到。

  

  ES6 规定,所有 Class 的原型的方法都是不可枚举的。总的来说,操作中引入继承的属性会让问题复杂化,大多数时候,我们只关心对象自身的属性。所以,尽量不要用for...in循环,而用Object.keys()代替。

 

原文地址:https://www.cnblogs.com/marvintang1001/p/11809665.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐