// 五、自有属性枚举顺序/*** ECMAScript6严格规定了对象的自有属性被枚举时的返回顺序,这会影响到Object.getOwnPropertyNames()** 自有属性枚举顺序基本规则:* 1. 所有数字按升序排序* 2. 所有字符串键,按照它们被加入对象的顺序排序* 3. 所有symbol键按照它们被加入对象的顺序排序*/var obj = {a: 1,0: 1,c: 1,2: 1,b: 1,1: 1};obj.d = 1;console.log(Object.getOwnPropertyNames(obj).join("")); // 012acbdconsole.log(Object.keys(obj).join("")); // 012acbdconsole.log(JSON.stringify(obj).toString()); // {"0":1,"1":1,"2":1,"a":1,"c":1,"b":1,"d":1}for (var index in obj) {console.log(index); // 0 1 2 a c d b}/*六、增强对象的原型1.改变对象的原型正常情况下,无论是构造函数还是Object.create()方法创建对象,其原型是在对象被创建时指定。对象原型在实例化之后保持不变,这是ECMAScript5的重要设定之一在 ECMAScript6中添加了 Object.setPrototypeof()方法来改变这一现状* */let person = {getGreeting() {return "Hello";}};let dog = {getGreeting(){return "Woof";}}// 以person对象作为原型// friend对象先继承person对象let friend = Object.create(person);console.log(friend.getGreeting()); // Helloconsole.log(Object.is(friend,person)); // falseconsole.log(Object.is(Object.getPrototypeOf(friend),person)); // trueconsole.log(Object.getPrototypeOf(friend) === person); // trueperson.age = 21;console.log(friend.age); // 21// 修改对象的原型, 原先与person对象的关联被解除,调用getGreeting()时是dog对象的方法Object.setPrototypeOf(friend, dog);console.log(friend.getGreeting()); // Woof/** 2. 简化原型访问的Super引用* ECMAScript6引入了Super引用的特性,使其可以更便捷的访问对象原型** */person = {getGreeting(){return "Hello";}};let egg = {getGreeting() {return "Woof";}};friend = {getGreeting() {// return Object.getPrototypeOf(this).getGreeting.call(this) +", hi";// Super引用不是动态变化的,它总是指向正确的对象return super.getGreeting() + ", hi";}}// 将原型设置为personObject.setPrototypeOf(friend,person); // 说白了就是继承console.log(friend.getGreeting()); // Hello hilet relative = Object.create(friend);console.log(relative.getGreeting()); // Hello hiconsole.log(person.getGreeting()); // Hello最后,可以使用super关键字调用对象原型上的方法,此时的this绑定被自动设置为当前作用域的this值