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循环遍历该对象时返回的顺序一致(但不包括原型链上的属性)。 |