一、es6原型相关方法
    proto属性是浏览器内部属性,不是正式对外的api,es6中并没有收入正文。
    es6提供了原型的操作方法。
    (1)Object.getPrototypeOf, 获取对象原型,参数如果不是对象,会进行转化。

    1. function Super (){
    2. this.name = 'SuperInstance'
    3. }
    4. let instance = new Super();
    5. console.log(Object.getPrototypeOf(instance) === Super.prototype) // =>true
    6. console.log(Object.getPrototypeOf(123)) // => Number.prototype

    (2)更改对象原型 Object.setPrototypeOf,es6正式推荐原型设置方法
    接收两个参数,返回第一个参数
    a.目标对象
    b.设置的原型
    如果第一个参数为非对象,会转化为对象,但是返回的是第一个参数,这个操作不产生任何影响。
    如果第一个参数为null或undefined,会报错。

    二、遍历方法
    (1)Objec.keys
    es5提供了Object.keys,用来获取对象所有自身可遍历属性箭名数组。会过滤Symbol属性名
    null和undefined会报错,其余对象非会转化成对象,只有字符串包装类有可遍历属性。

    1. let str = '123123'
    2. console.log(Object.keys(str)) // => ["0", "1", "2", "3", "4", "5"]

    (2)Object.values
    es7引入了Object.values和Object.entries作为遍历补充,还可和for … of配套使用。
    Object.values用来获取对象所有自身可遍历属性值数组
    Objec.values会过滤属性名为Symbol值的属性值
    参数为null和undefined会报错,只有字符串包装类型实例才有自身属性,其余包装类型返回结果为空数组。
    数字对象,默认原始值为0
    image.png
    布尔对象,默认原始值为false
    image.png
    字符串对象
    image.png

    1. console.log(Object.values('123')) // => ['1', '2', '3']

    (3)Object.entries
    返回一个包含二维数组,每个元素是对象可遍历属性键值数组, Symbol值属性依然会被忽略

    1. let o = {
    2. a: '1',
    3. b: '2',
    4. c: '3'
    5. }
    6. let entries = Object.entries(o);
    7. for(let [key, value] of entries ){ // 结构赋值 let [key, value] = ['a' : '1'];
    8. console.log(key, value) // 打印对象每个key与对应value
    9. }
    1. 三、Symbol<br />(1Symbol特点,引入原因<br />Symbol是一种**原始数据类型,不是对象**,所以无法添加属性。es5中,对象属性名都是字符串。为了避免属性名重复引入了Symbol。<br />**Symbol不是构造函数**,不能使用new运算符。<br />Symbol()接受一个**字符串参数**,**作为Symbol的描述**,用来控制台输出、转成字符串时进行区分。如果传入的是一个对象,则会调用起toString方法,再生成Symbol值。<br />获取Symbol描述,es6中需要将symbol值转化为字符串,es2019可以直接访问symbol.description<br />(2)注意点:<br />a.不管接收参数是否一样,产生的Symbol值都不相等(Symbol值的价值就是**独一无二**)
    1. let symbol1 = Symbol('1'),
    2. symbol2 = Symbol('2');
    3. console.log(typeof symbolVal) // => 'symbol'
    4. console.log(symbol1, symbol2) // => Symbol(1) , Symbol(2)
    5. console.log(symbol1.toString(), symbol2.toString()) // => 'Symbol(1)' , 'Symbol(2)'
    1. b.Symbol值不能参与计算,会报错,但是可以转化为字符串和布尔值(真值),不能转化为数字。

    (3)Symbol值作为属性名
    用标志符的方式不能将Symbol值作为属性名,可以用中括号、Object.defineProperty

    1. let mySymbol = Symbol('mySymbol'),
    2. o = {};
    3. o.mySymbol = 123;
    4. o[mySymbol] = 123;
    5. Object.defineProperty(o,mySymbol,{
    6. value : 678
    7. })

    (4)消除魔法字符串
    魔法字符串指,代码中多次出现的字符串,于代码形成了’ 强耦合’,不利于维护。将字符串存于一个变量中,统一引用该变量,维护的时候只需修改某个变量,省事。

    1. let shapeObj = {
    2. triangle : 'triangle'
    3. };
    4. function computor(shape, options){
    5. swicth(shape){
    6. case shapeObj.triangle :
    7. return options.width * option.length;
    8. ......
    9. }
    10. }
    11. computor('triangle',{width:123, length: 678})
    1. 5)遍历对象所有Symbol值属性名 Object.getOwnPropertySymbolsObject.assign可以复制对象可枚举Symbol值属性。
    1. let symbol123 = {
    2. [Symbol(123)] : 123
    3. }
    4. console.log(Object.getOwnPropertySymbols(symbol123))
    1. 6)查找Symbol值,以及Symbol描述值<br />Symbol.for方法,用于查找并返回对应描述的Symbol值,如果没有对应Symbol值,以参数为描述创建一个**全局登记的Symbol值**(Symbol()没有登记机制)
    1. function test(){
    2. console.log(Symbol.for('123')) //没有查找到的话,就生成一个全局Symbol值
    3. }
    4. console.log(Symbol.for('123')) // Symbol(123)

    Symbol.keyFor返回已登记的 Symbol 类型值的key(通过Symbol.for()创建的全局Symbol值)。

    1. let s1 = Symbol.for('123'),
    2. s2 = Symbol('123');
    3. console.log(Symbol.keyFor(s1), Symbol.keyFor(s2)) // '123', undefined