当前位置: 代码迷 >> 综合 >> ES6 对象扩展功能(二)
  详细解决方案

ES6 对象扩展功能(二)

热度:62   发布时间:2023-10-08 18:42:38.0
  // 五、自有属性枚举顺序/***  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值

 

  相关解决方案