【ES6】对象方法的扩展

41 阅读3分钟

ES6(ECMAScript 2015)在对象字面量方面引入了一些扩展,使得对象的方法定义和属性设置更加灵活和强大。以下是一些关于对象方法扩展的要点:

简洁方法定义

ES6允许在对象字面量中更简洁地定义方法。在ES5及之前,你需要使用函数表达式来定义对象的方法。ES6引入了更简洁的语法,允许你直接在对象字面量中定义方法。

ES5及之前:

var person = {  
  name: 'John',  
  greet: function() {  
    return 'Hello, ' + this.name;  
  }  
};

ES6:

const person = {  
  name: 'John',  
  greet() {  
    return `Hello, ${this.name}`;  
  }  
};

属性名表达式

在ES6中,你可以在对象字面量中使用[]来定义属性名,这使得你可以使用变量或表达式作为属性名。

const methodName = 'greet';  
const person = {  
  name: 'John',  
  [methodName]() {  
    return `Hello, ${this.name}`;  
  }  
};  
console.log(person.greet()); // Hello, John

方法

Object.assign() 方法对象的合并

如果出现相同的名称,则会出现对象的覆盖,后面覆盖前面的

const target = { a: 1, b: 2 };  
const source = { b: 4, c: 5 };  
const returnedTarget = Object.assign(target, source);  
console.log(target);       // { a: 1, b: 4, c: 5 }  
console.log(returnedTarget); // { a: 1, b: 4, c: 5 }  
// 注意:如果目标对象的属性具有相同的键,则源对象的属性将覆盖目标对象的属性。

Object.is

判断两个值是否完全相等

console.log(Object.is(120, 120));// === 
console.log(Object.is(NaN, NaN));// === 
console.log(NaN === NaN);// === 

Object.setPrototypeOf和getPrototypeOf() 设置原型对象

const school = {
    name: 'xx学校'
}
const cities = {
    xiaoqu: ['北京','上海','深圳']
}
Object.setPrototypeOf(school, cities);
console.log(Object.getPrototypeOf(school));
console.log(school);

 __proto__ 和 Object.getPrototypeOf()Object.setPrototypeOf()

虽然__proto__不是一个ES6的新特性(它已经在一些旧版JavaScript引擎中存在),但ES6正式引入了Object.getPrototypeOf()Object.setPrototypeOf()方法来更安全地获取和设置对象的原型。

  • Object.getPrototypeOf(obj):返回指定对象obj的原型。
  • Object.setPrototypeOf(obj, prototype):设置指定对象obj的原型到另一个对象或null(即obj.__proto__ = prototype)。

然而,需要注意的是,直接修改对象的原型链可能会破坏继承关系,因此应谨慎使用。

 Object.keys()Object.values()Object.entries()

ES6引入了三个新的方法来遍历对象的属性:

  • Object.keys(obj):返回一个由给定对象的自身可枚举属性键组成的数组。
  • Object.values(obj):返回一个由给定对象的所有可枚举属性值组成的数组。
  • Object.entries(obj):返回一个给定对象自身可枚举属性的键值对数组,其排列与使用for...in循环遍历该对象时返回的顺序一致(区别在于for...in循环还会枚举其原型链上的属性)。

方法表格整理

方法/特性描述
Object.assign()合并两个或多个对象的属性到第一个对象,返回目标对象。如果属性名相同,则后面的属性会覆盖前面的属性。
Object.is()判断两个值是否完全相等。与===操作符相比,Object.is()能够正确处理NaN+0-0的比较。
Object.setPrototypeOf()设置一个对象的原型(即__proto__属性)为另一个对象或null
Object.getPrototypeOf()返回指定对象的原型。
__proto__(非正式)对象的内部属性,指向其原型对象。虽然广泛使用,但不是ECMAScript标准的一部分,建议使用Object.getPrototypeOf()Object.setPrototypeOf()代替。
Object.keys()返回一个数组,包含给定对象的所有自身可枚举属性键。
Object.values()返回一个数组,包含给定对象的所有自身可枚举属性值。
Object.entries()返回一个给定对象自身可枚举属性的键值对数组,其顺序与使用for...in循环遍历该对象时返回的顺序一致(但不包括原型链上的属性)。